不知道用ictclas4j的人多不多,该项目地址是http://code.google.com/p/ictclas4j/ 关于ictclas分词系统讨论组地址是http://groups.google.com/group/ictclas
其中在ictclas4j项目的issues中有人提到一个问题“程序分词最后结果会吃掉一些字”,也就是漏字、漏词的问题。
问题地址为http://code.google.com/p/ictclas4j/issues/detail?id=2,但是没有人来回答。
我也碰到这个问题,只能自己看看了。经过对ictclas4j源程序的理解以及与原始c++版本(FreeICTCLAS)的源程序的比对,终于发现了错误所在:PosTagger.java文件中人名识别部分personRecognize方法里面出错了
ictclas4j的代码是
- if (sn.getPos() < 4 && unknownDict.getFreq(sn.getWord(), sn.getPos()) < Utility.LITTLE_FREQUENCY)
- personName += sn.getWord();
而原始C++版本里面代码为:
- if(m_nBestTag[nPos]<4 && personDict.GetFrequency(m_sWords[nPos],m_nBestTag[nPos])<LITTLE_FREQUENCY)
- nLittleFreqCount++;//The counter increase
- strcat(sPersonName,m_sWords[nPos]);
这两段代码里面personName和sPersonName含义是一样的,这样我们就看到错误在什么地方了。
估计sinboy在写程序的时候没看清。漏掉的nLittleFreqCount变量在ictclas4j里面添不添加都无所谓,对它暂时没什么影响(以后的版本有没有影响就不知道了),所以我们就直接将该if判断句的条件部分注释掉。
另外,看到它的sn.getWord()方法我还有点不放心,毕竟sn.getSrcWrod()取得的才是原始字词(参加SegNode类的注释),所以这个方法也改掉比较好。
最终,我的修改方法是将ictclas4j中PosTagger类的personRecognize方法里面的上段代码直接改为:
- personName += sn.getSrcWord();
也就是将该if判断句的条件部分注释掉。
如此再进行测试,ictclas4j就不会发生分词结果“漏字”、“漏词”、“吃掉词”的现象了。