命名实体识别(NER)综述

AI研习社 2019-02-01 10:30
关注文章
NER


本文为 AI 研习社编译的技术博客,原标题 :

A Review of Named Entity Recognition (NER) Using Automatic Summarization of Resumes

作者 | Mohan Gupta

翻译 | 邓普斯•杰弗

校对 | 酱番梨     整理 | 菠萝妹

原文链接:

https://towardsdatascience.com/a-review-of-named-entity-recognition-ner-using-automatic-summarization-of-resumes-5248a75de175



命名实体识别(NER)综述


本篇文章旨在带你了解NER是什么,它在行业中是如何使用的,NER的各种库,以及使用NER进行简历总结的代码实践。

这个博客讲述了自然语言处理(NLP)和信息检索(IR)中的一个称为命名实体识别(NER)的领域,以及我们如何通过只提取主要实体(如姓名、教育背景、技能等)来应用它来自动生成简历摘要。


  什么是命名实体识别?

命名实体识别(NER)(也称为实体识别、实体分块和实体提取)是信息提取的一个子任务,旨在将文本中的命名实体定位并分类为预先定义的类别,如人员、组织、位置、时间表达式、数量、货币值、百分比等。

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


  最先进的NER模型

Spacy NER模型:

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

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

模型结构:

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

SPACY'S ENTITY RECOGNITION MODEL: incremental parsing with Bloom embeddings & residual CNNs


斯坦福命名实体识别器:

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

模型体系结构:

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

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


NER模型实例:

命名实体识别在自然语言处理和信息检索领域有着广泛的应用。以下列举的例子很少:

简历自动汇总:

各公司人力资源部面临的一个关键挑战是评估一大堆求职者的简历。为了增加他们的亮点,申请者往往过于详细化他们的简历,其中大部分信息与评估者所寻求的无关。为了简化这一过程,通过我们的NER模型,我们可以方便地对简历进行快速评估,从而简化在一堆简历中筛选候选人所需的工作。

优化搜索引擎算法:

为了设计一种搜索引擎算法,而不是在数百万篇在线文章和网站上搜索输入的查询,一种更有效的方法是对文章运行一次NER模型,并永久存储与之相关的实体。然后,可以将搜索查询中的关键标记与与网站文章关联的标记进行比较,以实现快速高效的搜索。

强大的推荐系统:

NER可用于开发推荐系统的算法,自动过滤我们可能感兴趣的相关内容,并据此指导我们根据以前的行为发现相关和未访问的相关内容。这可以通过提取与我们的历史或以前活动中的内容相关联的实体,并将它们与分配给其他未公开内容的标签进行比较,以筛选相关的实体来实现。


简化客户支持:

NER可用于识别客户投诉和反馈中的相关实体,如产品规格、部门或公司分支机构的详细信息,以便对反馈进行相应分类,并转发给负责识别产品的相应部门。

在接下来的章节中,我们将详细介绍使用NER模型实现简历摘要。


  基于NER的简历摘要:


数据集:

当然,第一个任务是创建手动注释的训练数据来训练模型。为此,从在线工作平台上下载220份简历。这些文档被上传到DataTurks在线注释工具并手动注释。

该工具可以自动解析文档,允许我们为感兴趣的重要实体创建注释,并生成JSON格式的培训数据,每行包含文本语料库和注释。

数据集的快照如下:

上面的数据集由220份带注释的简历组成。我们用200个简历数据对模型进行训练,并在20个简历数据上进行测试。


在python中使用spacy模型训练自定义模型:


数据格式:

DataTurks注释工具生成的JSON格式数据示例如下:

模型训练:

我们使用python的spacy模块来训练ner模型。Spacy的模型是统计的,他们所做的每一个“决定”---例如,要分配的语音标记的哪一部分,或者一个单词是否是命名实体,都是一个预测。这个预测是基于模型在训练中看到的例子。

然后将模型显示未标记的文本,并进行预测。因为我们知道正确的答案,所以我们可以以损失函数的误差梯度的形式给出模型对其预测的反馈,计算出训练示例和预期输出之间的差异。差异越大,梯度和模型更新就越明显。

当训练一个模型时,我们不希望它只记住我们的例子-我们希望它提出可以在其他例子中泛化的理论。毕竟,我们不只是想让模型知道,这里的“亚马逊”的一个实例就是一家公司,我们希望它知道,在这种情况下,“亚马逊”最有可能是一家公司。为了调整准确性,我们分批处理我们的训练示例,并用小批量和dropout进行实验。

当然,只显示一个模型一次示例是不够的。尤其是如果您只有很少的示例,那么您将需要进行多次迭代的训练。在每次迭代中,对训练数据进行洗牌,以确保模型不会根据实例的顺序进行任何泛化。

另一种提高学习效果的方法是设置一个dropout,即随机“删除”单个特征和表示的速率。这使得模型更难记忆训练的数据。例如,0.25的dropout意味着每个特征或内部表示有1/4的可能性被丢弃。我们对模型进行了10个epoch的训练,并将dropout率保持为0.2。

以下是训练模型的代码片段:

DataTurks-Engg/Entity-Recognition-In-Resumes-SpaCyContribute to Entity-Recognition-In-Resumes-SpaCy development by creating an account on GitHub.github.com

Spacy模型的结果和评估:

该模型在20份简历上进行了测试,并将预测的汇总简历存储为每个简历单独的txt文件。

对于测试模型的每个简历,我们计算模型识别的每个实体的准确度得分、精度、召回和F分数。对每个实体的这些度量值进行汇总和平均,以生成一个总体得分,以根据包含20份简历的测试数据评估模型。实体评估结果见下文。结果表明,预测结果具有良好的准确性。

通过我们的模型预测得到的来自eauty.com的员工未公开简历示例摘要如下:

Accenture员工简历,可从indeed.com获取。

 简历总结的输出结果


使用Java中的斯坦福NER模型来训练自定义模型:

数据集格式:
训练数据必须以文本文件的形式传输,以便每行包含一个单词标签对,其中单词和标签标签标签由一个制表位\t分隔。对于文本文档,就像在我们的例子中一样,我们将文档标记为单词,并为每个单词添加一行,并将相关的标记添加到训练文件中。为了指示下一个文件的开始,我们在训练文件中添加了一个空行。

以下是输入训练文件的示例:


注:每个单词必须包含一个标签。这里,对于我们不关心的单词,我们使用的是标签“0”。

属性文件:
斯坦福corenlp需要一个属性文件,其中包含构建自定义模型所需的参数。例如,我们可以定义提取用于学习的功能的方法等。下面是一个属性文件的示例:

# location of the training file
trainFile = ./standford_train.txt
# location where you would like to save (serialize) your
# classifier; adding .gz at the end automatically gzips the file,
# making it smaller, and faster to load
serializeTo = ner-model.ser.gz

# structure of your training file; this tells the classifier that
# the word is in column 0 and the correct answer is in column 1
map = word=0,answer=1# This specifies the order of the CRF: order 1 means that features
# apply at most to a class pair of previous class and current class
# or current class and next class.
maxLeft=1# these are the features we'd like to train with
# some are discussed below, the rest can be
# understood by looking at NERFeatureFactory
useClassFeature=true
useWord=true
# word character ngrams will be included up to length 6 as prefixes
# and suffixes only
useNGrams=true
noMidNGrams=true
maxNGramLeng=6
usePrev=true
useNext=true
useDisjunctive=true
useSequences=true
usePrevSequences=true
# the last 4 properties deal with word shape features
useTypeSeqs=true
useTypeSeqs2=true
useTypeySequences=true
#wordShape=chris2useLC
wordShape=none
#useBoundarySequences=true
#useNeighborNGrams=true
#useTaggySequences=true
#printFeatures=true
#saveFeatureIndexToDisk = true
#useObservedSequencesOnly = true
#useWordPairs = true

模型训练:

斯坦福大学corenlp的主要类是crfclassifier,它拥有实际的模型。在Github中提供的代码(链接已附加在下面)中,我们提供了使用训练数据和属性文件训练模型的代码,并将模型保存到磁盘,以避免每次训练的时间消耗。下一次,当我们使用模型对一个看不见的文档进行预测时,我们只需从磁盘加载经过训练的模型,然后使用到进行分类。

输出中的第一列包含输入标记,而第二列引用正确的标签,第三列是分类器预测的标签。

以下是用于训练模型并将其保存到磁盘的代码片段:

DataTurks-Engg/Entity-Recognition-In-Resumes-StanfordNER
Contribute to Entity-Recognition-In-Resumes-StanfordNER development by creating an account on GitHub.github.com

斯坦福NER模型的结果和评估:

该模型在20份简历上进行了测试,并将预测的汇总简历存储为每个简历单独的txt文件。

对于测试模型的每个简历,我们计算模型识别的每个实体的准确度得分、精度、召回和F分数。对每个实体的这些度量值进行汇总和平均,以生成一个总体得分,以根据包含20份简历的测试数据评估模型。实体评估结果见下文。结果表明,预测结果具有良好的准确性。

通过我们的模型预测得到的来自eauty.com的员工未公开简历示例总结如下:

一份简历示例

总结的结果(输出)


Spacy、Stanford Ner和最先进模型的比较:

现实世界中简历文档中的绝大多数标记不是通常定义的实体名称的一部分,因此基线精度,召回是非常高的,通常大于90%;按照这种逻辑,两个模型的实体精度召回值都相当好。

从对模型的评估和观察到的结果来看,在总结简历的任务上,Spacy似乎优于斯坦福大学的Ner。对两个模型确定的实体的F分数的审查如下:

这是resumes数据集。

用于训练以上项目的Python代码GitHub库。
斯坦福NER模型的Java代码GitHub库。

谢谢  Hamza Bendemra.


https://ai.yanxishe.com/page/TextTranslation/1434


微信扫一扫
关注该公众号

{{panelTitle}}
支持Markdown和数学公式,公式格式:\\(...\\)或\\[...\\]

还没有内容

关注微信公众号