命名实体识别

简介

命名实体识别(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代表该字不属于命名实体的一部分。如:

这里当然也可以采用更复杂的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输出的隐状态序列 (\vec{h_1},\vec{h_2},...,\vec{h_n})与反向LSTM的 (\underset{h_1}{\leftarrow},\underset{h_2}{\leftarrow},...,\underset{h_n}{\leftarrow})在各个位置输出的隐状态进行按位置拼接 h_t= [\vec{h_t},\overleftarrow{h_4}]\in R^{n*m},得到完整的隐状态序列(h_1,h_2,...,h_n)\in R^{n*m}

在设置dropout后,接入一个线性层,将隐状态向量从 m 维映射到 k 维,k是标注集的标签数,从而得到自动提取的句子特征,记作矩阵 P=(p_1,p_2,...,p_n)\in R^{n*k} 。可以把 p_i\in R^k的每一维 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的打分为

score(x,y) = \sum_{i=1}^{n}{P_{i,y_i}}+\sum_{i=1}^{n+1}{A_{y_{i-1}y_i}}

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

P(y|x)=\frac{exp(score(x,y))}{\sum_{​{y}'}{exp(score(x,{y}'))}}

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

logP(y^x|x)=score(x,y^x)-log(\sum{exp(score(x,{y}'))})

如果这个算法要自己实现的话,需要注意的是指数的和的对数要转换成 log\sum_{i}{exp(x_i)}=a+log\sum_{i}{exp(x_i-a)}(TensorFlow有现成的CRF,PyTorch就要自己写了),在CRF中上式的第二项使用前向后向算法来高效计算。

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

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

参考文章:

  • https://zhuanlan.zhihu.com/p/56085975
  • https://zhuanlan.zhihu.com/p/40212878
  • https://www.cnblogs.com/Determined22/p/7238342.html

新手探索NLP(五)相关推荐

  1. 新手探索NLP(六)——全文检索

    全文检索技术--Lucene的介绍 转载自https://blog.csdn.net/yerenyuan_pku/article/details/72582979 查看全文 http://www.ta ...

  2. 新手探索NLP(四)

    学习NLP需要一个比较系统的概要.所以理论上这个应该写在第一篇. [NLP的技术概貌] NLP里细分领域和技术实在太多,根据NLP的终极目标,大致可以分为自然语言理解(NLU)和自然语言生成(NLG) ...

  3. 新手探索NLP(三)

    目录 NLP语言模型 词的表示方法类型 1.词的独热表示one-hot representation 简介 不足 2. 词的分布式表示distributed representation 简介 建模类 ...

  4. 新手探索NLP(十五)——终章

    目录 中文语音的机器处理 汉语语言学的研究 未登录词识别 概率图模型 信息熵 互信息 联合熵 条件熵 统计语言模型 隐马尔科夫模型 Viterbi算法 最大熵模型 最大熵原理 GIS实现 条件随机场模 ...

  5. 新手探索NLP(八)——序列标注

    转载自知乎https://zhuanlan.zhihu.com/p/50184092 NLP中的序列标注问题(隐马尔可夫HMM与条件随机场CRF) Introduction 序列标注问题(sequen ...

  6. 新手探索NLP(九)——文本摘要

    转载自知乎https://zhuanlan.zhihu.com/p/67078700 文本摘要是一种从一个或多个信息源中抽取关键信息的方法,它帮助用户节省了大量时间,用户可以从摘要获取到文本的所有关键 ...

  7. 新手探索NLP(一)

    目录 基础知识模块 1. 概念 2. 正则化表达 Data Cleaning模块 3. 去掉标点 4. 切分词功能 5. 去掉停止词 6. Stemming & Lemmatizing ste ...

  8. 新手探索NLP(十二)——文本聚类

    简介 聚类又称群分析,是数据挖掘的一种重要的思想,聚类(Cluster)分析是由若干模式(Pattern)组成的,通常,模式是一个度量(Measurement)的向量,或者是多维空间中的一个点.聚类分 ...

  9. 新手探索NLP(十一)——知识图谱

    转载自https://blog.csdn.net/JH_Zhai/article/details/79919604 知识图谱 根据 W3C的解释,语义网络是一张数据构成的网络,语义网络技术向用户提供的 ...

最新文章

  1. c语言二元运算符大全,C语言运算符大全
  2. vue企业项目demo_基于SpringBoot和Vue的企业级中后台开源项目
  3. php 设置post大小_php 修改上传文件大小限制实例详解
  4. spring整合ehcache2.5.2缓存异常-- net.sf.ehcache.CacheException
  5. 安装服务器系统多少钱,服务器系统安装费用
  6. java基本数据类型转为String类型的4种常见方法
  7. Linux du命令和df命令
  8. matlab 读取mdf文件路径,从 MDF 文件中读取数据
  9. 重庆php就业前景,重庆就业前景最好的十大专业是哪些_中职中专网
  10. vue 项目中 自动生成 二维码
  11. 【arcgis10.8最新版安装】
  12. 【C语言】深入理解二级指针
  13. 杨守鸿 计算机学院,计算机学院军训师生慰问暨新生见面会顺利举办
  14. 解决spark运行时控制台打印冗杂的INFO(屏蔽掉无用的INFO)
  15. android小米手机变慢,小米手机用久了又慢又卡怎么办?
  16. 2019年第一本书《幸福的婚姻》思维导图+感想
  17. No mapping for GET /swagger-ui.html Springboot+swagger2 报错解决方法
  18. deal.II中文文档
  19. 916计算机网络概论哪些学校,2019计算机网络概论考研大纲(916)
  20. Linux线程互斥学习笔记--详细分析

热门文章

  1. 13.MongoDB 连接命令格式
  2. 【学习摘录】推荐算法
  3. .NET Core 使用Dapper 操作MySQL
  4. Java-并发-LockSynchronized
  5. Linq之Expression高级篇(常用表达式类型)
  6. c++ const 关键字 学习笔记
  7. 【转】C语言的位运算的优势
  8. 海量数据处理的思路和方法
  9. linux的周期计划任务叫atd,linux计划任务
  10. android查看控件的xml属性,006 Android XML 控件属性设置技巧汇总