中文 NLP(9) -- 实体识别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32023541/article/details/84761530

(1)实体识别

识别 人名,地名,组织机构,日期,时间,百分数,货币这七大实体。重点是人名,地名和组织机构的识别。属于未登录词识别的范畴。

人名特征:当今仍使用,活跃的中文姓氏大致有1000 多个,前 586 个姓占了 98.5%。其余姓氏不到 1.5%。名字用字分布较姓氏用字分布要平缓,分散。共 3679 个名字用字,词性分布也很广泛,不仅有实词,还有各类虚词。

地名特征:较之人名相比,地名更像一个闭集。绝大部分地名可以通过相关资料覆盖。如《中国地名录》,《地理词典》,《地物名词》词典集,但也有困难的情况,比如用词比较自由,分散等。。。

组织机构:相比人名、地名,这是难度最大的识别,以上所有的难点都出现在此,再加上本身的难点。

(2)专名词典 + CRF 模型算法识别

设计思路就是将命名实体的任务从中文分词的基础模块中分离出来,命名实体作为一个独立的模块位于基础分词步骤之后。在LTP3.3 和 StanfordNLP 中都把命名实体作为一个单独的模块来处理。与专名词典特征提取如下(部分)

基于提取的特征构建 CRF 训练模型。。。然后整体的分词流程如下

分词流程如下:

(1)首先通过原子切分,将字符串转换为字符列表,这个阶段与 ICTCLAS 的分词方法相似。

(2)与内部词典(或用户导入词典)进行最大匹配,根据匹配结果给出成词的特征函数。

(3)将字符串与匹配到的词典词汇共同匹配特征模板,包括 CRF 的标准模板和内部词典匹配结果特征模板。

(4)根据匹配的模板,查询和计算模板的概率。

(5)建立词网,使用 Viterbi 算法解码。

(6)输出分词结果。

(3)叠层 HMM 模型 

算法思想:首先在词语粗切分的基础上,采用底层 HMM 模型识别出普通无嵌套的人名,地名和机构名等比如【辛普森】,然后依次采取高层 HMM 模型识别出嵌套了人名,地名的复杂地名和机构名。比如【美国/辛普森/公司】

在叠层式 HMM 的基础上,加入基于角色标注的命名实体方法如下:

HanLP 角色表(来自 enum NT)
角色 意义 例子
A 上文 【参与】亚太经合组织的活动
B 下文 中央电视台【报道】
X 连接词 北京【和】天津
C 特征词的一般前缀 北京【电影】学院
F 特征词的译名性前缀 美国【摩托罗拉】公司
G 特征词的地名性前缀 交通银行【北京】分行
H 特征词的机构名前缀 【中共中央】顾问委员会
I 特征词的特殊性前缀 【中央】电视台
J 特征词的简称性前缀 【巴】政府
K 整个机构 【麦当劳】
L 方位词 ——
M 数词 公交集团【五】分公司
P 单字碎片 ——
D 机构名的特征词 国务院侨务【办公室】
W 符号 ——
S 句子的开头 ——
Z 非机构名成分 ——

标注顺序如下:

比如: 参与/v [北京/ns 电影/n 学院/nis]/nt  和/cc [美国/nsf 辛普森/nr 公司/nis] / nt 的/ude 活动/vn

(1)添加句首句尾

[始##始/S 参与/v [北京/ns 电影/n 学院/nis]/nt  和/cc [美国/nsf 辛普森/nr 公司/nis] / nt 的/ude 活动/vn  末##/末/Z]

(2)标注上文

[始##始/S 参与/A  [北京/ns 电影/n 学院/nis]/nt  和/A  [美国/nsf 辛普森/nr 公司/nis] / nt 的/ude 活动/vn  末##/末/Z]

(3)标注下文

[始##始/S 参与/A  [北京/ns 电影/n 学院/nis]/nt  和/B  [美国/nsf 辛普森/nr 公司/nis] / nt 的/B 活动/vn  末##/末/Z]

(4)标注中间

[始##始/S 参与/A  [北京/ns 电影/n 学院/nis]/nt  和/X  [美国/nsf 辛普森/nr 公司/nis] / nt 的/B 活动/vn  末##/末/Z]

(5)处理整个句子

[始##始/S 参与/A  未##地/G 电影/C 学院/D  和/X  未##地/G 未##人/F 公司/D 的/B 活动/Z 末##/末/Z]

然后根据标注的语料统计角色词典如下,后面数字代表频率

公司  D 4621 A 24 B 24
公司总部 B 1
公司治理 B 2
公司股票 B 1
公告    B 15 X 1
公告栏  B 2
公园    C 9
公安    C 728 A 19 B 5
...

然后统计转移概率矩阵,从一个角色标签转移到另一个角色的频次。

  A B ... Z
A 0 0 ... 0
B 3013 0 ... 125708
... ... ... ... ...
Z 95874 0 ... 19796133

举例如下:比如在组织机构名识别之前(先识别人名,地名),会得到如下输出

[济南/ns 杨铭宇/nr 餐饮/n 管理/vn 有限公司/nis 是/vshi 由/p  杨先生/nr 创办/v]

然后根据角色标注如下:

[S 1162194][济南 G 83472 B 1200 A 470 D 84 X 4] [杨铭宇 F 4309 B 769 A 266 D 254 X6] [餐饮 C 58 B 12][管理 C 706 B 70 A 5] [有限公司 D 2861 A 1 B 1][是 A 2340 B 353 X 20 P 2][由 A 1579 B 16 X 11] [杨先生 F 4309 B 769 A 266 D 254 X 6][创办 A 20 B 5][B 710]

然后根据 HMM 计算机构名角色标注如下:

[/S 济南/G 杨铭宇/F 餐饮/C 管理/C 有限公司/D 是/B 由/A 杨先生/F 创办/A /B]

[始##始/S 未##地/G 未##人/F 餐饮/C 管理/C 有限公司/D 是/B 由/A 未##人/F 创办/A 末##末/B]

最后进行模式匹配,有一个组织机构名称的角色模式库。当上文识别出角色标注串与组织机构的模式串匹配时,就认为识别出了一个组织机构。部分如下

CCCD
PPD
PPDCD
PPFCCD
PPFCD
...

经过细分,识别出机构名【济南杨铭宇餐饮管理有限公司】GFCCD 。

猜你喜欢

转载自blog.csdn.net/qq_32023541/article/details/84761530