现在的位置: 首页 > 综合 > 正文

ictclas4j的一个bug

2013年12月03日 ⁄ 综合 ⁄ 共 1456字 ⁄ 字号 评论关闭
 

不知道用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的代码是

Java代码  
  1. if (sn.getPos() < 4 && unknownDict.getFreq(sn.getWord(), sn.getPos()) < Utility.LITTLE_FREQUENCY)   
  2.     personName += sn.getWord();  

 而原始C++版本里面代码为:

Cpp代码  
  1. if(m_nBestTag[nPos]<4 && personDict.GetFrequency(m_sWords[nPos],m_nBestTag[nPos])<LITTLE_FREQUENCY)   
  2.     nLittleFreqCount++;//The counter increase   
  3. strcat(sPersonName,m_sWords[nPos]);  

 这两段代码里面personName和sPersonName含义是一样的,这样我们就看到错误在什么地方了。

估计sinboy在写程序的时候没看清。漏掉的nLittleFreqCount变量在ictclas4j里面添不添加都无所谓,对它暂时没什么影响(以后的版本有没有影响就不知道了),所以我们就直接将该if判断句的条件部分注释掉。

另外,看到它的sn.getWord()方法我还有点不放心,毕竟sn.getSrcWrod()取得的才是原始字词(参加SegNode类的注释),所以这个方法也改掉比较好。

 

最终,我的修改方法是将ictclas4j中PosTagger类的personRecognize方法里面的上段代码直接改为:

Java代码  
  1. personName += sn.getSrcWord();  

 

也就是将该if判断句的条件部分注释掉。 

如此再进行测试,ictclas4j就不会发生分词结果“漏字”、“漏词”、“吃掉词”的现象了。

 

抱歉!评论已关闭.