我在做一个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的人名识别话题。
时间: 2024-10-27 11:53:45