关于人名识别中的丢字现象

11 views
Skip to first unread message

zjwang

unread,
Apr 17, 2009, 2:27:54 AM4/17/09
to ictclas
在personRecognize人名识别中,不知道下面这个判断的意义是什么
if (unknownDict.getFreq(sn.getSrcWord(), sn.getPos(), gbkID) <
Utility.LITTLE_FREQUENCY)
personName += sn.getSrcWord()

加了这个判断后,如果有个词"###"符合BCD模式,但最后一个#不满足小于Utility.LITTLE_FREQUENCY,导致
personName 中没有该字,最后分词结果中就丢了这个字,而且人名识别中只有这一处用到了nr字典,如果这个判断不用的话就不需要加载nr字典
了吧.
Utility.LITTLE_FREQUENCY=6.为什么要加频率小于6的判断呢?

Tao Wang

unread,
Apr 17, 2009, 4:58:06 AM4/17/09
to ictclas
这段代码源自FreeICTCLAS里Tag\Span.cpp中的CSpan::PersonRecognize()函数,其中相应的代码为:

...
int nLittleFreqCount;//Counter for the person name role with little
frequecy
...
//Get the possible name
nPos=j;//Record the person position in the tag sequence
sPersonName[0]=0;
nLittleFreqCount=0;//Record the number of role with little
frequency
while(nPos<j+nPatternLen[k])
{//Get the possible person name
//
if(m_nBestTag[nPos]<4&&personDict.GetFrequency(m_sWords
[nPos],m_nBestTag[nPos])<LITTLE_FREQUENCY)
nLittleFreqCount++;//The counter increase
strcat(sPersonName,m_sWords[nPos]);
nPos+=1;
}

这应该是对小频率的字进行特殊的处理,6只是表示一个小频率而已,没有来源,应该是经验数据。至于丢字,那应该是bug。

zjwang

unread,
Apr 17, 2009, 5:18:45 AM4/17/09
to ictclas

那我把这个条件去掉,不对小频率进行特殊处理,这样还不用加载nr字典了,去掉这个条件会有什么不好的影响吗?

> > Utility.LITTLE_FREQUENCY=6.为什么要加频率小于6的判断呢?- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Tao Wang

unread,
Apr 17, 2009, 5:27:35 AM4/17/09
to ictclas
我没有测试过,可能人名识别准确度会降低,你可以对包含上千人名的文本测试一下,看看有什么差异。

至于nr字典,我印象中无论如何都需要加载的。因为调用维特比算法判断当前角色的时候,一定会需要未登录词词典来计算词频。因此即使
PersonRecognize()函数不需要这个词典,其它的地方也需要加载的。

FreeICTCLAS的bug很多,我建议你针对问题解决问题,比如最后一个字吃掉了,那你就添加补丁,让它在这种情况下不吃掉就好了。

Reply all
Reply to author
Forward
0 new messages