Java 8 實作詞頻計數
辨識給定清單中單字的頻率是自然語言處理中的一項基本任務。 Java 8 提供了一種通用方法,可以使用其強大的流 API 和內建收集器來有效地計算單字的出現次數。
問題:
考慮以下單字清單:
<code class="java">List<String> wordsList = Lists.newArrayList("hello", "bye", "ciao", "bye", "ciao");</code>
目標是決定每個單字的頻率計數,從而產生如下輸出:
<code class="java">{ciao=2, hello=1, bye=2}</code>
Java 8 解:
與傳統方法不同,Java 8 採取了不同的方法:
<code class="java">Map<String, Long> collect = wordsList.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));</code>
在這行在程式碼中,stream() 方法用於從WordsList 啟動元素流。隨後,Collectors.groupingBy() 根據元素的身份(單字本身)收集元素,Collectors.counting() 計算每個出現的頻率。
對於整數,可以稍微修改程式碼:
<code class="java">Map<String, Integer> collect = wordsList.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(e -> 1)));</code>
依數值排序:
此外,結果圖可以依詞頻降序排序:
<code class="java">LinkedHashMap<String, Long> countByWordSorted = collect.entrySet() .stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> { throw new IllegalStateException(); }, LinkedHashMap::new ));</code>
此附加程式碼片段將一個條目集追加到流中,根據值按降序對其進行排序,並將條目收集到LinkedHashMap 中以維護排序順序。
以上是如何使用 Java 8 的 Stream API 有效地統計列表中的詞頻?的詳細內容。更多資訊請關注PHP中文網其他相關文章!