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版本的,期待中吧

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值