首页 > 代码库 > ansj 2.0.7 错误例子分析

ansj 2.0.7 错误例子分析

我在做一个solr的项目,分词选定了ansj分词。

选择ansj的原因:

1)身边若干朋友的念叨,说是效果不错

2)网上看了若干评论,说是不错

3)自己尝试了一些case,觉得确实不错。

好了,项目中选择了ansj2.0.7-min.jar作为实际使用的版本。

结果。。。愿望是美好的,现实是残酷的。

碰到了若干case,效果不好(使用IndexAnalysis):

1)上海马勒别墅

切分结果:(上/海马/勒/别墅)

预期结果:(上海/马勒/别墅)

调试了一下,在构建Graph的时候没有问题,问题出现在Merger阶段的

            @Override            public List<Term> merger() {                graph.walkPath();//上海马勒别墅的问题在这里// 数字发现                if (MyStaticValue.isNumRecognition && graph.hasNum) {                    NumRecognition.recognition(graph.terms);                }                // 姓名识别                if (graph.hasPerson && MyStaticValue.isNameRecognition) {                    // 亚洲人名识别                    new AsianPersonRecognition(graph.terms).recognition();                    graph.walkPathByScore();                    NameFix.nameAmbiguity(graph.terms);                    // 外国人名识别                    new ForeignPersonRecognition(graph.terms).recognition();                    graph.walkPathByScore();                }                // 用户自定义词典的识别                userDefineRecognition(graph, forests);                return result();            }

2)电话卡+周杰伦摩天轮巡演(开启人名识别)

切分结果:(电话/卡+周/杰伦摩/天轮/巡演)

期望结果: (电话卡/+/周杰伦/摩天轮/巡演)

结果发现, 卡+周 居然被识别成了一个名词。进一步debug发现,“+” 的PersonNatureAttr 属性值不太正常,因为"+"的TermNatures 是TermNatures.NULL.

最终debug发现, TermNatures.NULL 这个常量被修改过。

最终的最终发现,作者在AnsjItem中定义了成员变量引用到了 TermNatures.NULL,并对其进行了修改。

问题发现,并修复掉。

---------------------------------------------------------------------------------------------------------------------------------最终将bug反馈给作者。打完收工

后记,发现人名识别效果分析。

下期再谈论Ansj的人名识别话题。

ansj 2.0.7 错误例子分析