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中文网其他相关文章!