命名实体识别

简介

命名实体识别(NER)(也称为实体识别、实体分块和实体提取)是信息提取的一个子任务,旨在将文本中的命名实体定位并分类为预先定义的类别,如人员、组织、位置、时间表达式、数量、货币值、百分比等。通常包括两部分:(1)实体边界识别;(2) 确定实体类别(人名、地名、机构名或其他)。

NER系统已经建立起来,使用基于语言语法的技术以及统计模型,如机器学习。手工制作的基于语法的系统通常可以获得更好的精度,但代价是低召回并且需要经验丰富的计算语言学家数月工作才能实现。统计NER系统通常需要大量人工注释的训练数据。为了避免部分注释工作,建议使用半监督方法。

先进模型

Spacy NER模型:

作为一个免费的开放源码库,Spacy使Python中的高级自然语言处理(NLP)变得更加简单方便。

Spacy为python中的命名实体识别提供了一个非常有效的统计系统,它可以将标签分配给连续的令牌组。它提供了一个默认模型,可以识别各种命名或数字实体,其中包括公司名称、位置、组织、产品名称等。除了这些默认实体之外,SPACY还可以通过训练模型以用新的被训练示例更新,将使模型可以任意类添新的命名实体,进行识别。

模型结构:

SPACY中的统计模型是定制设计的,提供了速度和精度的出色性能组合。目前使用的体系结构尚未发布,但以下视频概述了该模型如何工作,主要关注NER模型。

斯坦福命名实体识别器:

Stanford NER是一个命名实体Recognizer,用Java实现。它提供了一个默认的训练模型,主要用于识别组织、人员和位置等实体。除此之外,还提供针对不同语言和环境训练的各种模型。

模型体系结构:

斯坦福NER因为线性链条件随机场(CRF)序列模型已经在软件中实现,所以也被称为CRF(条件随机场)分类器。我们可以使用自己的标注数据集为各种应用程序训练自己的自定义模型。

CRF模型最初由Lafferty、McCallum和Pereira(2001)首创;请参阅Sutton和McCallum(2006)或Sutton和McCallum(2010)了解详细的可理解介绍。

基于NLTK的命名实体识别:

由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公开数据集、模型上提供了全面、易用的接口,涵盖了分词、词性标注(Part-Of-Speech tag, POS-tag)、命名实体识别(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各项NLP领域的功能。

 

中文文本分析命名实体识别

挑战

(1) 中文文本里不像英文那样有空格作为词语的界限标志,而且“词”在中文里本来就是一个很模糊的概念,中文也不具备英文中的字母大小写等形态指示

(2) 中文的用字灵活多变,有些词语在脱离上下文语境的情况下无法判断是否是命名实体,而且就算是命名实体,当其处在不同的上下文语境下也可能是不同的实体类型

(3) 命名实体存在嵌套现象,如“北京大学第三医院”这一组织机构名中还嵌套着同样可以作为组织机构名的“北京大学”,而且这种现象在组织机构名中尤其严重

(4) 中文里广泛存在简化表达现象,如“北医三院”、“国科大”,乃至简化表达构成的命名实体,如“国科大桥”。、

解决方法

基于字的BiLSTM-CRF模型

使用基于字的BiLSTM-CRF,主要参考的是文献[4][5]。使用Bakeoff-3评测中所采用的的BIO标注集,即B-PER、I-PER代表人名首字、人名非首字,B-LOC、I-LOC代表地名首字、地名非首字,B-ORG、I-ORG代表组织机构名首字、组织机构名非首字,O代表该字不属于命名实体的一部分。如:

      新手探索NLP(五)

这里当然也可以采用更复杂的BIOSE标注集。

以句子为单位,将一个含有 nn 个字的句子(字的序列)记作

x=(x1,x2,...,xn)

其中xi表示句子的第 ii 个字在字典中的id,进而可以得到每个字的one-hot向量,维数是字典大小。

模型的第一层是 look-up 层,利用预训练或随机初始化的embedding矩阵将句子中的每个字 xixi 由one-hot向量映射为低维稠密的字向量(character embedding)xi∈Rdxi∈Rd ,dd 是embedding的维度。在输入下一层之前,设置dropout以缓解过拟合。

模型的第二层是双向LSTM层,自动提取句子特征。将一个句子的各个字的char embedding序列 (x1,x2,...,xn)作为双向LSTM各个时间步的输入,再将正向LSTM输出的隐状态序列 新手探索NLP(五)与反向LSTM的 新手探索NLP(五)在各个位置输出的隐状态进行按位置拼接 新手探索NLP(五),得到完整的隐状态序列新手探索NLP(五)

在设置dropout后,接入一个线性层,将隐状态向量从 m 维映射到 k 维,k是标注集的标签数,从而得到自动提取的句子特征,记作矩阵 新手探索NLP(五) 。可以把 新手探索NLP(五)的每一维 pij都视作将字 xi分类到第 j个标签的打分值,如果再对 P进行Softmax的话,就相当于对各个位置独立进行 k类分类。但是这样对各个位置进行标注时无法利用已经标注过的信息,所以接下来将接入一个CRF层来进行标注。

      模型的第三层是CRF层,进行句子级的序列标注。CRF层的参数是一个 (k+2)×(k+2)(k+2)×(k+2) 的矩阵 AA ,AijAij 表示的是从第 ii 个标签到第 jj 个标签的转移得分,进而在为一个位置进行标注的时候可以利用此前已经标注过的标签,之所以要加2是因为要为句子首部添加一个起始状态以及为句子尾部添加一个终止状态。如果记一个长度等于句子长度的标签序列 y=(y1,y2,...,yn),那么模型对于句子 x的标签等于 y的打分为

新手探索NLP(五)

可以看出整个序列的打分等于各个位置的打分之和,而每个位置的打分由两部分得到,一部分是由LSTM输出的 pipi 决定,另一部分则由CRF的转移矩阵 AA 决定。进而可以利用Softmax得到归一化后的概率:

新手探索NLP(五)

模型训练时通过最大化对数似然函数,下式给出了对一个训练样本 (x,yx)(x,yx) 的对数似然:

新手探索NLP(五)

如果这个算法要自己实现的话,需要注意的是指数的和的对数要转换成 新手探索NLP(五)(TensorFlow有现成的CRF,PyTorch就要自己写了),在CRF中上式的第二项使用前向后向算法来高效计算。

模型在预测过程(解码)时使用动态规划的Viterbi算法来求解最优路径:y∗=argmaxy′score(x,y′)y∗=arg⁡maxy′score(x,y′)

整个模型的结构如下图所示:

新手探索NLP(五)

参考文章:

 

 

 

相关文章: