java 中文词频统计_Java实现中文词频统计

本文介绍了如何在Java中使用ansj_seg库进行中文词频统计。首先通过添加ansj_seg和nlp-lang的依赖,然后对文本进行分词处理,接着过滤并统计词频,最后找出出现次数最多的词汇。
摘要由CSDN通过智能技术生成

昨日有个中文词频统计的需求, 百度一番后, 发现一大堆标题党文章, 讲的与内容严重不符, 这里就简单记录下自己实现的流程吧!

与英文单词的词频统计不同, 中文的难点在于如何分词, 不过好在有许多优秀的现成库供调用,这里就使用了 ansj_seg 插件.

首先添加依赖:

下载jar

访问 http://maven.nlpcn.org/org/ansj/ 最好下载最新版 ansj_seg/

同时下载nlp-lang.jar 需要和ansj_seg 配套..配套关系可以看jar包中的maven依赖,一般最新的ansj配最新的nlp-lang不会有错。

导入到eclipse ,开始你的程序吧

maven

org.ansj

ansj_seg

5.1.1

基本用法为:

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 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> iterator = map.entrySet().iterator();

while (iterator.hasNext()){

Map.Entry entry = iterator.next();

System.out.println(entry.getKey() + ": " + entry.getValue());

}

List> list = new ArrayList<>();

Map.Entry 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 getMax(Map map){

if (map.size() == 0){

return null;

}

Map.Entry maxEntry = null;

boolean flag = false;

Iterator> iterator = map.entrySet().iterator();

while (iterator.hasNext()){

Map.Entry 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();

}

最后依旧附上图片:

62493e4174700e09583ed71c68e37705.png

作者:Asche

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现词频统计的一种简单方法是使用Java中的HashMap数据结构,将每个单词作为键,出现次数作为值。具体实现步骤如下: 1. 读取文本文件,将文件内容存储在一个字符串中。 2. 使用正则表达式将字符串中的非字母字符替换为空格,以便将文本分割成单词。 ```java String content = readFileAsString("input.txt"); // 读取文本文件 content = content.replaceAll("[^a-zA-Z]", " "); // 将非字母字符替换为空格 ``` 3. 将文本分割成单词,并统计每个单词出现的次数。 ```java Map<String, Integer> wordCount = new HashMap<>(); String[] words = content.split("\\s+"); for (String word : words) { word = word.toLowerCase(); // 将单词转换为小写字母,以便不区分大小写 if (!word.isEmpty()) { int count = wordCount.getOrDefault(word, 0); wordCount.put(word, count + 1); } } ``` 4. 输出每个单词及其出现次数。 ```java for (String word : wordCount.keySet()) { int count = wordCount.get(word); System.out.println(word + ": " + count); } ``` 完整代码如下: ```java import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; public class WordCount { public static void main(String[] args) throws IOException { String content = readFileAsString("input.txt"); // 读取文本文件 content = content.replaceAll("[^a-zA-Z]", " "); // 将非字母字符替换为空格 Map<String, Integer> wordCount = new HashMap<>(); String[] words = content.split("\\s+"); for (String word : words) { word = word.toLowerCase(); // 将单词转换为小写字母,以便不区分大小写 if (!word.isEmpty()) { int count = wordCount.getOrDefault(word, 0); wordCount.put(word, count + 1); } } for (String word : wordCount.keySet()) { int count = wordCount.get(word); System.out.println(word + ": " + count); } } private static String readFileAsString(String filePath) throws IOException { return new String(Files.readAllBytes(Paths.get(filePath))); } } ``` 其中,`readFileAsString`方法用于读取文本文件并返回字符串。如果需要统计多个文件的词频,可以将整个统计过程放到一个循环中,每次读取一个文件并更新词频统计结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值