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

ictclas4j的一个bug

阅读更多

不知道用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就不会发生分词结果“漏字”、“漏词”、“吃掉词”的现象了。

 

另外好像据sinboy自己曾说过要将ictclas4j升级到1.0的版本,现在是0.9.1版本的,期待中吧

 

分享到:
评论
3 楼 Programmer2.x 2009-06-05  
还不出1.0版本,我看过ictclas4j的源码,那代码,唉。。。。
2 楼 chenlb 2009-01-21  
结合 lucene 比较难用, 因为没有 startOffest与endOffest
1 楼 cris_jxg 2008-12-23  
非常感谢,呵呵。不知道自定义词库是不是可以实现加载

相关推荐

Global site tag (gtag.js) - Google Analytics