下载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