下载ik最新版本:
IK Analyer 2012-FF hotfix 1 完整分发包
这个版本是支持lucene4的.其主页为:https://code.google.com/p/ik-analyzer/
下载ansj最新版本:
ansj_seg
下载mmesg4j最新版本
https://code.google.com/p/mmseg4j/选择其中mmseg4j-1.9.1.v20130120-SNAPSHOT.zip 版本
然后建立一个web project,把相应的包导入,具体细节不用再详述。
建立一个测试类,贴出其中关键代码:
使用ik进行分词:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public String ikAnalyzer(String str) { Reader input = new StringReader(str); // 智能分词关闭(对分词的精度影响很大) IKSegmenter iks = new IKSegmenter(input, true); Lexeme lexeme = null; StringBuilder sb = new StringBuilder(); try { while ((lexeme = iks.next()) != null) { sb.append(lexeme.getLexemeText()).append("|"); } } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } |
使用ansj进行分词
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public String ansjAnalyzer(String str) { List<Term> terms = NlpAnalysis.paser(str); new NatureRecognition(terms).recognition(); StringBuilder sb = new StringBuilder(); for (Term term : terms) { if (!" ".equals(term.getName()) && !" ".equals(term.getName()) && term.getName().trim().replaceAll("[\\pP\\pM\\pS]", "").length() > 1) { sb.append(term.getName()).append("|"); } } return sb.toString(); } |
使用ansj分词找出词性为名词的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public String ansjAnalyzerNature(String str) { List<Term> terms = NlpAnalysis.paser(str); new NatureRecognition(terms).recognition(); StringBuilder sb = new StringBuilder(); System.out.println(terms.toString()); // 词性过滤 Nature nature; for (Term term : terms) { nature = term.getNatrue(); if (nature.natureStr.subSequence(0, 1).equals("n") || nature.natureStr.subSequence(0, 1).equals("h")) { if (!" ".equals(term.getName()) && !" ".equals(term.getName()) && term.getName().trim().replaceAll("[\\pP\\pM\\pS]", "").length() > 1) { sb.append(term.getName()).append("|"); } } } return sb.toString(); } |
使用mmseg4j进行分词:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public String mmseg4jAnalyzer(String str)throws IOException{ Reader input = new StringReader(str); return segWords(input, "|"); } public String segWords(Reader input, String wordSpilt) throws IOException { StringBuilder sb = new StringBuilder(); Seg seg = getSeg(); //取得不同的分词具体算法 MMSeg mmSeg = new MMSeg(input, seg); Word word = null; boolean first = true; while((word=mmSeg.next())!=null) { if(!first) { sb.append(wordSpilt); } String w = word.getString(); sb.append(w); first = false; } return sb.toString(); } protected Seg getSeg() { return new ComplexSeg(Dictionary.getInstance()); } |
输入的文章:
官员揭公车使用乱象:不单是私用 普遍“家用”
测试结果为:
再输入别的文章:
北京市教委:非京籍考生入美籍即可高考不属实”
测试结果为:
通过输入别的文章发现,速度基本上差不多,分词效果也还差不多。只不过ansj提供了分析词性的功能。算法比较复杂。
个别词有的词未认识出来,是由于词库的原因。
总结
在实际应用中,根据个人的以上项目熟悉程度,随便选择以上三种分词算法的任意一种,其实速度和效果都差不多。重要的是词库。根据业务的需要,整理出相应的词库,这会对分词效果有比较大的提升。
如果搞源码研究,个人推荐ik分词和mmseg4j分词,这两个算法也比较简单,可以比较快的吃透。
http://www.chepoo.com/ik-ansj-mmseg4j-segmentation-performance-comparison.html