`
m635674608
  • 浏览: 4930619 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

IK,ansj,mmseg4j分词性能比较

 
阅读更多

下载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());
	}

输入的文章:
官员揭公车使用乱象:不单是私用 普遍“家用”
测试结果为:
QQ图片20130525182118
QQ图片20130525182216
QQ图片20130525182227

再输入别的文章:
北京市教委:非京籍考生入美籍即可高考不属实”
测试结果为:
QQ图片20130525182232
QQ图片20130525182239
QQ图片20130525182242

通过输入别的文章发现,速度基本上差不多,分词效果也还差不多。只不过ansj提供了分析词性的功能。算法比较复杂。
个别词有的词未认识出来,是由于词库的原因。

总结
在实际应用中,根据个人的以上项目熟悉程度,随便选择以上三种分词算法的任意一种,其实速度和效果都差不多。重要的是词库。根据业务的需要,整理出相应的词库,这会对分词效果有比较大的提升。

如果搞源码研究,个人推荐ik分词和mmseg4j分词,这两个算法也比较简单,可以比较快的吃透。

http://www.chepoo.com/ik-ansj-mmseg4j-segmentation-performance-comparison.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics