人名识别问题

61 views
Skip to first unread message

zjwang

unread,
May 19, 2009, 11:18:30 PM5/19/09
to ictclas
人名识别中当找到符合模式的人名时,有个判断语句
if (sn.getPos() < 4 && unknownDict.getFreq(sn.getSrcWord(), sn.getPos
(), gbkID) < Utility.LITTLE_FREQUENCY)
personName += sn.getSrcWord();
其中sn.getPos() < 4的依据是什么呢?
在前面的GraphGenerate.generate方法中,在coredict词典中只有一个词性时取相应的词性,如果多于一个词性词性取0
if (sa.getPosCount() == 1) {
Pos pos = sa.getPos(0);
sg = new SegNode(i, j, pos.getTag(), sa.getTotalFreq(), word);
} else
sg = new SegNode(i, j, 0, sa.getTotalFreq(), word);
而且数字和字母作为未知的词性都是负数.
那人名识别中限制sn.getPos() < 4基本上符合的就是coredict中词性多于一个的词了.这对于限制人名识别有什么意义呢?

liugang

unread,
May 20, 2009, 3:38:21 AM5/20/09
to ict...@googlegroups.com
这里的sn.getPos()对应的是nr.dct里的词性
==============================构成人名的角色=================================
Tag = B(  1), Count =   513,    姓氏
Tag = C(  2), Count =   955,    双名的首字
Tag = D(  3), Count = 1,043,    双名的末字
Tag = E(  4), Count =   574,    单名
Tag = F(  5), Count =     3,    前缀
Tag = G(  6), Count =     9,    后缀
*Tag = K( 10), Count =     0,   人名的上文
Tag = L( 11), Count = 1,198,    人名的下文
Tag = M( 12), Count = 1,684,    两个中国人名之间的成分
Tag = N( 13), Count =    67,    <无>
*Tag = U( 20), Count =     0,   人名的上文与姓氏成词
*Tag = V( 21), Count =     0,   人名的末字与下文成词
Tag = X( 23), Count =    84,    姓与双名首字成词
Tag = Y( 24), Count =    47,    姓与单名成词
Tag = Z( 25), Count =   388,    双名本身成词
Tag = m( 44), Count =    58,    <无>
Tag = *(100), Count =     1,    始##始
Tag = *(101), Count =     1,    末##末
 
应该改成小于5,就是把能够构成姓名的词提出来,组合成名字

2009/5/20 zjwang <wangzhi...@yahoo.com.cn>



--
Yours sincerely
liugang

zjwang

unread,
May 20, 2009, 4:33:45 AM5/20/09
to ictclas
我看ictclas4j中sn.getPos()对应的不一定是nr.dct里的词性,人名识别前首先posTag,把nr.dct的词性加入到sn的
AdjoiningPos里,然后判断coredict中是否有该词,如果有继续加sn.addPos(new AdjoiningPos(0 ,
value));这里词性设为0
接下来从AdjoiningPos里找到最佳词性getBestPos,然后标出最佳词性tagBest(sns),在tagBest(sns)方法中
只有满足
sn.getPos() == POSTag.NOUN_LETTER || sn.getPos() == POSTag.NUM时,才把
AdjoiningPos中最佳词性赋给sn,代码如下:
if (sn.getPos() == POSTag.NOUN_LETTER || sn.getPos() == POSTag.NUM) {
for (AdjoiningPos pos : allPos) {
if (pos.isBest() && pos.getPos().getTag() > 0) {
sn.setPos(pos.getPos().getTag());
break;
}
}
}
而其它只是pos.setBest(true);并没有调用sn.setPos方法,这样的话在人名识别中sn.getPos()大多数情况就不是
nr,dct中的词性了,还是词性标注前graphgenerate中的词性,只有象"百"这样的数词,由于sn.getPos() ==
POSTag.NUM,所以在tagBest(sns)中sn.setPos(pos.getPos().getTag());才是nr.dct中的词
性,
所以搞不清人名识别中设置sn.getPos() < 4的意义


On 5月20日, 下午3时38分, liugang <liuga...@gmail.com> wrote:
> 这里的sn.getPos()对应的是nr.dct里的词性
> ==============================构成人名的角色=================================
> Tag = B( 1), Count = 513, 姓氏
> Tag = C( 2), Count = 955, 双名的首字
> Tag = D( 3), Count = 1,043, 双名的末字
> Tag = E( 4), Count = 574, 单名
> Tag = F( 5), Count = 3, 前缀
> Tag = G( 6), Count = 9, 后缀
> *Tag = K( 10), Count = 0, 人名的上文
> Tag = L( 11), Count = 1,198, 人名的下文
> Tag = M( 12), Count = 1,684, 两个中国人名之间的成分
> Tag = N( 13), Count = 67, <无>
> *Tag = U( 20), Count = 0, 人名的上文与姓氏成词
> *Tag = V( 21), Count = 0, 人名的末字与下文成词
> Tag = X( 23), Count = 84, 姓与双名首字成词
> Tag = Y( 24), Count = 47, 姓与单名成词
> Tag = Z( 25), Count = 388, 双名本身成词
> Tag = m( 44), Count = 58, <无>
> Tag = *(100), Count = 1, 始##始
> Tag = *(101), Count = 1, 末##末
>
> 应该改成小于5,就是把能够构成姓名的词提出来,组合成名字
>

> 2009/5/20 zjwang <wangzhijiang...@yahoo.com.cn>

Reply all
Reply to author
Forward
0 new messages