前言
最近有根據文件內容進行詞頻分析的需求,如果是純英文的,寫個程序處理比較容易,但涉及到中文詞頻分析,最關鍵的一步就是中文分詞。
搜了不少文章,最後找到一篇比較好用的 Java實現中文詞頻統計。主要利用了ansj_seg進行中文分詞,分詞後再進行詞頻統計。
針對文章中提供的代碼示例,做了稍許改動,貼在下面 做個記錄。
依賴
添加最新版ansj_seg依賴
<dependency>
<groupId>org.ansj</groupId>
<artifactId>ansj_seg</artifactId>
<version>5.1.6</version>
</dependency>
代碼實現
代碼可見 AloofJr
package com.my.tools.ansj;
import com.alibaba.common.lang.StringUtil;
import org.ansj.splitWord.analysis.ToAnalysis;
import java.io.*;
import java.util.*;
/**
* 對文件中文分詞後,根據詞頻排序輸出
* @author wq
* @date 2020/4/8
*/
public class Analysis {
public static void main(String[] args) throws IOException {
wordFrequency("");
}
public static void wordFrequency(String path) throws IOException {
List<Map.Entry<String, Integer>> wordList = getWordList(path);
wordList.forEach(entry -> {
System.out.println(entry.getKey() + "\t" + entry.getValue());
});
}
/**
* 獲取 分詞-詞頻 列表
* */
private static List<Map.Entry<String, Integer>> getWordList(String path) throws IOException {
Map<String, Integer> map = new HashMap<>(16);
String result = ToAnalysis.parse(getString(path)).toStringWithOutNature();
//分詞後的內容,分詞間使用英文逗號分隔。
String[] words = result.split(",");
for (String word : words) {
String str = word.trim();
// 過濾空白字符
if (StringUtil.isBlank(str)) {
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);
}
}
return sortByValue(map);
}
/**
* 根據詞頻從高到低排序
* */
private static List<Map.Entry<String, Integer>> sortByValue(Map<String, Integer> map) {
if (map == null) {
return null;
}
List<Map.Entry<String, Integer>> list = new ArrayList<>();
list.addAll(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
return list;
}
/**
* 獲取文件內容
* */
private static String getString(String path) throws IOException {
FileInputStream inputStream = new FileInputStream(new File(path));
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
出處:https://www.cnblogs.com/asche/p/9673611.html
更多文章
見我的博客:https://nc2era.com
written by AloofJr,轉載請註明出處