Java实现中文词频统计
昨日有个中文词频统计的需求, 百度一番后, 发现一大堆标题党文章, 讲的与内容严重不符, 这里就简单记录下自己实现的流程吧!
与英文单词的词频统计不同, 中文的难点在于如何分词, 不过好在有许多优秀的现成库供调用,这里就使用了 ansj_seg 插件.
首先添加依赖:
下载jar
- 访问 http://maven.nlpcn.org/org/ansj/ 最好下载最新版 ansj_seg/
- 同时下载nlp-lang.jar 需要和ansj_seg 配套..配套关系可以看jar包中的maven依赖,一般最新的ansj配最新的nlp-lang不会有错。
- 导入到eclipse ,开始你的程序吧
maven
<dependency>
<groupId>org.ansj</groupId>
<artifactId>ansj_seg</artifactId>
<version>5.1.1</version>
</dependency>
基本用法为:
String str = "欢迎使用ansj_seg,(ansj中文分词)在这里如果你遇到什么问题都可以联系我.我一定尽我所能.帮助大家.ansj_seg更快,更准,更自由!" ;
System.out.println(ToAnalysis.parse(str));
欢迎/v,使用/v,ansj/en,_,seg/en,,,(,ansj/en,中文/nz,分词/n,),在/p,这里/r,如果/c,你/r,遇到/v,什么/r,问题/n,都/d,可以/v,联系/v,我/r,./m,我/r,一定/d,尽我所能/l,./m,帮助/v,大家/r,./m,ansj/en,_,seg/en,更快/d,,,更/d,准/a,,,更/d,自由/a,!
下面就贴上代码:
public static void wordFrequency() throws IOException { Map<String, Integer> map = new HashMap<>(); String article = getString(); String result = ToAnalysis.parse(article).toStringWithOutNature(); String[] words = result.split(","); for(String word: words){ String str = word.trim(); // 过滤空白字符 if (str.equals("")) continue; // 过滤一些高频率的符号 else if(str.matches("[)|(|.|,|。|+|-|“|”|:|?|\\s]")) continue; // 此处过滤长度为1的str else if (str.length() < 2) continue; if (!map.containsKey(word)){ map.put(word, 1); } else { int n = map.get(word); map.put(word, ++n); } } Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator(); while (iterator.hasNext()){ Map.Entry<String, Integer> entry = iterator.next(); System.out.println(entry.getKey() + ": " + entry.getValue()); }
List<Map.Entry<String, Integer>> list = new ArrayList<>(); Map.Entry<String, Integer> entry;
while ((entry = getMax(map)) != null){ list.add(entry); } System.out.println(Arrays.toString(list.toArray())); } /** * 找出map中value最大的entry, 返回此entry, 并在map删除此entry * @param map * @return */ public static Map.Entry<String, Integer> getMax(Map<String, Integer> map){ if (map.size() == 0){ return null; } Map.Entry<String, Integer> maxEntry = null; boolean flag = false; Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator(); while (iterator.hasNext()){ Map.Entry<String, Integer> entry = iterator.next(); if (!flag){ maxEntry = entry; flag = true; } if (entry.getValue() > maxEntry.getValue()){ maxEntry = entry; } } map.remove(maxEntry.getKey()); return maxEntry; } /** * 从文件中读取待分割的文章素材.
* 文件内容来自简书热门文章: https://www.jianshu.com/p/5b37403f6ba6 * @return * @throws IOException */ public static String getString() throws IOException { FileInputStream inputStream = new FileInputStream(new File("/home/as_/IdeaProjects/SpringMaven/article-txt")); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder strBuilder = new StringBuilder(); String line; while((line = reader.readLine()) != null){ strBuilder.append(line); } reader.close(); inputStream.close(); return strBuilder.toString(); }
最后依旧附上图片:
作者:Asche
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决