命名实体识别(Named EntitiesRecognition,NER)是自然语言处理的一个基础任务。其目的是识别语料中人名、地名、组织机构名等命名实体,比如,2015年中国国家海洋局对124个国际海底地理实体的命名。
由于命名实体数量不断增加,通常不可能在词典中穷尽列出,且其构成方法具有各自的一些规律性,因而,通常把对这些词的识别从词汇形态处理(如汉语切分)任务中独立处理,称为命名实体识别。
命名实体识别技术是信息抽取、信息检索、机器翻译、问答系统等多种自然语言处理技术必不可少的组成部分。
常见的命名实体识别方法综述
命名实体是命名实体识别的研究主体,一般包括三大类(实体类、时间类和数字类)和七小类(人名、地名、机构名、时间、日期、货币和百分比)命名实体。评判一个命名实体是否被正确识别包括两个方面:实体的边界是否正确和实体的类型是否标注正确。
命名实体识别的主要技术方法分为:基于规则和词典的方法、基于统计的方法、二者混合的方法等。
1.基于规则和词典的方法。
基于规则的方法多采用语言学专家手工构造规则模板,选用特征包括统计信息、标点符号、关键字、指示词和方向词、位置词(如尾字)、中心词等方法,以模式和字符串相匹配为主要手段,这类系统大多依赖于知识库和词典的建立。基于规则和词典的方法是命名实体识别中最早使用的方法,一般而言,当提取的规则能比较精确地反映语言现象时,基于规则的方法性能要优于基于统计的方法。但是这些规则往往依赖于具体语言、领域和文本风格,编制过程耗时且难以涵盖所有的语言现象,特别容易产生错误,系统可移植性不好,对于不同的系统需要语言学专家重新书写规则。基于规则的方法的另外一个缺点是代价太大,存在系统建设周期长、移植性差而且需要建立不同领域知识库作为辅助以提高系统识别能力等问题。
2.基于统计的方法。
基于统计机器学习的方法主要包括隐马尔可夫模型(HiddenMarkovMode,HMM)、最大熵(MaxmiumEntropy,ME)、支持向量机(Support VectorMachine,SVM)、条件随机场(ConditionalRandom Fields,CRF)等。
在基于统计的这四种学习方法中,最大熵模型结构紧凑,具有较好的通用性,主要缺点是训练时间长复杂性高,有时甚至导致训练代价难以承受,另外由于需要明确的归一化计算,导致开销比较大。而条件随机场为命名实体识别提供了一个特征灵活、全局最优的标注框架,但同时存在收敛速度慢、训练时间长的问题。一般说来,最大熵和支持向量机在正确率上要比隐马尔可夫模型高一些,但隐马尔可夫模型在训练和识别时的速度要快一些,主要是由于在利用 Viterbi 算法求解命名实体类别序列时的效率较高。隐马尔可夫模型更适用于一些对实时性有要求以及像信息检索这样需要处理大量文本的应用,如短文本命名实体识别。
基于统计的方法对特征选取的要求较高,需要从文本中选择对该项任务有影响的各种特征,并将这些特征加入到特征向量中。依据特定命名实体识别所面临的主要困难和所表现出的特性,考虑选择能有效反映该类实体特性的特征集合。主要做法是通过对训练语料所包含的语言信息进行统计和分析,从训练语料中挖掘出特征。有关特征可以分为具体的单词特征、上下文特征、词典及词性特征、停用词特征、核心词特征以及语义特征等。
基于统计的方法对语料库的依赖也比较大,而可以用来建设和评估命名实体识别系统的大规模通用语料库又比较少。
3.混合方法。
自然语言处理并不完全是一个随机过程,单独使用基于统计的方法使状态搜索空间非常庞大,必须借助规则知识提前进行过滤修剪处理。目前几乎没有单纯使用统计模型而不使用规则知识的命名实体识别系统,在很多情况下是使用混合方法:
- 统计学习方法之间或内部层叠融合。
- 规则、词典和机器学习方法之间的融合,其核心是融合方法技术。在基于统计的学习方法中引入部分规则,将机器学习和人工知识结合起来。
- 将各类模型、算法结合起来,将前一级模型的结果作为下一级的训练数据,并用这些训练数据对模型进行训练,得到下一级模型。
命名实体识别的一般流程
如下图所示,一般的命名实体流程主要分为四个步骤:
- 对需要进行提取的文本语料进行分词;
- 获取需要识别的领域标签,并对分词结果进行标签标注;
- 对标签标注的分词进行抽取;
- 将抽取的分词组成需要的领域的命名实体。
动手实战命名实体识别
命名实体的类别,我们在第01课中已经给出了,这里不再赘述,下面通过 jieba 分词包和 pyhanlp 来实战命名实体识别和提取。
1.jieba 进行命名实体识别和提取。
第一步,引入 jieba 包:
import jieba
import jieba.analyse
import jieba.posseg as posg
第二步,使用 jieba 进行词性切分,allowPOS 指定允许的词性,这里选择名词 n 和地名 ns:
sentence=u'''上线三年就成功上市,拼多多上演了互联网企业的上市奇迹,却也放大平台上存在的诸多问题,拼多多在美国上市。'''
kw=jieba.analyse.extract_tags(sentence,topK=10,withWeight=True,allowPOS=('n','ns'))
for item in kw:
print(item[0],item[1])
在这里,我们可以得到打印出来的结果:
上市 1.437080435586
上线 0.820694551317
奇迹 0.775434839431
互联网 0.712189275429
平台 0.6244340485550001
企业 0.422177218495
美国 0.415659623166
问题 0.39635135730800003
可以看得出,上市和上线应该是动词,这里给出的结果不是很准确。接下来,我们使用 textrank 算法来试试:
kw=jieba.analyse.textrank(sentence,topK=20,withWeight=True,allowPOS=('ns','n'))
for item in kw:
print(item[0],item[1])
这次得到的结果如下,可见,两次给出的结果还是不一样的。
上市 1.0
奇迹 0.572687398431635
企业 0.5710407272273452
互联网 0.5692560484441649
上线 0.23481844682115297
美国 0.23481844682115297
2.pyhanlp 进行命名实体识别和提取。
第一步,引入pyhanlp包:
from pyhanlp import *
第二步,进行词性切分:
sentence=u'''上线三年就成功上市,拼多多上演了互联网企业的上市奇迹,却也放大平台上存在的诸多问题,拼多多在美国上市。'''
analyzer = PerceptronLexicalAnalyzer()
segs = analyzer.analyze(sentence)
arr = str(segs).split(" ")
第三步,定义一个函数,从得到的结果中,根据词性获取指定词性的词:
def get_result(arr):
re_list = []
ner = ['n','ns']
for x in arr:
temp = x.split("/")
if(temp[1] in ner):
re_list.append(temp[0])
return re_list
第四步,我们获取结果:
result = get_result(arr)
print(result)
得到的结果如下,可见比 jieba 更准确:
['互联网', '企业', '奇迹', '平台', '问题', '美国']
总结
本文对命名实体识别的方法进行了总结,并给出一般的处理流程,最后通过简单的 jieba 分词和 pyhanlp 分词根据词性获取实体对象,后续大家也可以尝试通过哈工大和斯坦福的包来处理,下篇我们通过条件随机场 CRF 来训练一个命名实体识别模型。