结巴分词介绍
现在开源的中文分词工具,有IK、MMseg4j、THULAC、Ansj、Jieba、HanLP等,其中最近还在更新并维护的,也是目前分词效果比较优秀的要属于Ansj、Jieba、HanLP了。
之前我写过Ansj分词器的介绍说明博客,现在细谈一下Jieba分词的详细思路及其实现过程。
代码地址:https://download.csdn.net/download/qq_26408545/10479349
JieBatest2类,是该方法
里面的util为文件预读类,test。txt为测试文档,正常去处空格和括号特使字符最好。
结巴分词主页
结巴分词的github主页地址是:https://github.com/fxsjy/jieba(python版),原作者fxsjy是用python写的,后来有网友写了其他编程语言的版本。
目前官方页面推荐的java版结巴分词地址是:https://github.com/huaban/jieba-analysis(java版),这个java版的结巴分词只有针对搜索引擎分词的功能,我在这个之上做了优化改进,并添加了词性标志功能后,已经pull request 给作者piaolingxue了。
我改进后的结巴分词的java版地址是:https://github.com/shibing624/xmnlp ,该项目还在完善中,欢迎大家fork。
结巴分词简介
特点
- 支持三种分词模式:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- 支持繁体分词
- 支持自定义词典
public static void main(String[] args) throws Exception {
String text = ReadTxt.txtToString(new File("D:/test.txt"));String txt = null ;
JiebaSegmenter segmenter = new JiebaSegmenter();
//将结果转成分词进行统计
List<String> list = new ArrayList<String>();
list =segmenter.sentenceProcess(text);
//统计固定分词出现的频率
System.out.println("\n - 计算'人民'出现的次数");
System.out.println("人民 " + Collections.frequency(list, "人民"));
//统计所有分析出现的频率(会有重复项)
Set<String> uniqueSet = new HashSet(list);
for (String temp : uniqueSet) {
System.out.println(temp + ": " + Collections.frequency(list, temp));
}
//用map计算分词出现的频率
System.out.println("\n例子3 -用Map来计算对象出现的次数");
Map<String, Integer> map = new TreeMap<String, Integer>();
for (String temp : list) {
Integer count = map.get(temp);
map.put(temp, ((count == null) ? 1 : count + 1));
}
//将map统计的分词频率排序-转成list。
List<Map.Entry<String,Integer>> list2 = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
Collections.sort(list2,new Comparator<Map.Entry<String,Integer>>() {
public int compare(Entry<String, Integer> o1,
Entry<String, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
//将排序结果输出
for(Map.Entry<String,Integer> mapping:list2){
System.out.println(mapping.getKey()+":"+mapping.getValue());
txt = txt +mapping.getKey()+":"+mapping.getValue()+" ";
}
//输出接过到txt中
if(txt != null)
ReadTxt.StringToTxt(txt);
}