NER模型在简历/简历中查找人名是什么?

时间:2015-12-28 23:54:44

标签: nlp stanford-nlp named-entity-recognition

我刚刚开始使用Stanford CoreNLP,我想构建一个自定义的NER模型来找到

不幸的是,我没有为意大利人找到一个好的模型。我需要在简历/ CV文档中找到这些实体。

这里的问题是那些文档可能有不同的结构,例如我可以:

案例1

- Name: John

- Surname: Travolta

- Last name: Travolta

- Full name: John Travolta

(so many labels that can represent the entity of the person i need to extract)

案例2

My name is John Travolta and I was born ...

基本上,我可以拥有结构化数据(使用不同的标签)或我应该找到这些实体的上下文。

此类文件的最佳方法是什么?在这种情况下,maxent模型可以工作吗?

EDIT @ vihari-piratla

目前,我采用策略来找到左边有东西的模式,右边有东西,按照这种方法我有80/85%找到实体。

示例:

Name: John
Birthdate: 2000-01-01

这意味着我在模式的左侧有“Name:”,右侧有 \ n (直到找到 \ n )。 我可以创建一个很长的模式列表。我想到了模式,因为我不需要在“其他”上下文中使用名称。

例如,如果用户在工作经历中写入其他名称,则不需要它们。因为我在寻找个人名字,而不是其他人。使用这种方法,我可以减少误报,因为我会查看特定的模式,而不是“一般名称”。

这种方法的一个问题是我有一个很大的模式列表(1个模式= 1个正则表达式),所以如果我添加其他模式,它就不能很好地扩展。

如果我可以训练一个具有所有这些模式的NER模型,它会很棒,但我应该使用大量的文档来训练它。

4 个答案:

答案 0 :(得分:7)

案例1的传统(可能是最佳)方法是编写文档分段代码,而案例2是大多数系统的设计目标。您可以搜索谷歌学者的“文档细分”,以获得“最佳”方法的一些想法。最常见的(也是最容易实现的)是简单地使用正则表达式,如果文档结构一致,则可以非常有效。其他方法更复杂,但通常在文档结构更加多样化时需要。

您的NER管道至少需要:

  1. 预处理/文本标记化。从简单的几个开始 标记化规则
  2. 文档分段(冒号,破折号,定位标题,任何形式等)。我会从正则表达式开始。
  3. POS标记(最好是使用现成的东西,比如使用意大利语的TreeTagger)
  4. NER,一个MaxEnt模型可以使用,其中一些重要的功能是大写,POS标签和可能的字典功能(意大利电话簿?)。您需要一些带标签的数据。

答案 1 :(得分:7)

第一个案件可能是微不足道的,我同意Ozborn的建议。

我想就案例2提出一些建议 斯坦福NLP提供了一个优秀的英文名称识别器,但可能无法找到所有人名。 OpenNLP也提供了不错的表现,但比斯坦福要小得多。还有许多其他实体识别器可用于英语。我将重点关注StanfordNLP,这里有几点需要考虑。

  1. 公报。您可以为模型提供名称列表,还可以自定义“公报”条目的匹配方式。斯坦福在设置时还提供了草率匹配选项,允许与公报条目进行部分匹配。部分匹配应该适用于人名。

  2. 斯坦福大学建设性地认可实体。如果在文件中,有一个名字,如约翰特拉沃尔塔"被认可,然后它也会得到#Travolta"在同一份文件中,即使它没有关于"特拉沃尔塔"的事先没有想法。因此,尽可能多地在文档中附加信息。添加在case-1中识别的名称,在熟悉的上下文中,例如"我的名字是John Travolta。"如果"约翰特拉沃尔塔"被案例1中采用的规则所承认。添加虚假句子可以提高召回率。

  3. 制定培训基准是一个非常昂贵和枯燥的过程;你应该按照数万个句子的顺序进行注释,以获得不错的测试性能。我相信即使你有一个经过注释的训练数据训练的模型,性能也不会比你实施上述两个步骤更好。

    <强> @edit

    由于这个问题的提问者对无监督的基于模式的方法感兴趣,我正在扩展我的答案来讨论这些问题。

    当监督数据不可用时,通常使用称为引导模式学习方法的方法。该算法从一小组感兴趣的种子实例(如书籍列表)开始,并输出更多相同类型的实例 有关更多信息,请参阅以下资源

    • SPIED是一种使用上述技术的软件,可供下载和使用。
    • Sonal Gupta获得博士学位。关于这个主题,她的论文可用here
    • 有关此主题的简要介绍,请参阅这些slides

    由于

答案 2 :(得分:4)

你可以使用Stanford NLP。例如,这里有一些使用nltk和stanford mlp库的python代码

docText="your input string goes here"

words = re.split("\W+",docText) 

stops = set(stopwords.words("english"))

#remove stop words from the list
words = [w for w in words if w not in stops and len(w) > 2]

str = " ".join(words)
print str
stn = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz') 
stp = StanfordPOSTagger('english-bidirectional-distsim.tagger') 
stanfordPosTagList=[word for word,pos in stp.tag(str.split()) if pos == 'NNP']

print "Stanford POS Tagged"
print stanfordPosTagList
tagged = stn.tag(stanfordPosTagList)
print tagged

这应该在输入字符串中为您提供所有专有名词

答案 3 :(得分:0)

如果它是您正在谈论的简历/简历类型文档,那么最好的办法是建立一个语料库或以降低的准确度开始#34;期望并通过在用户使用您的系统时教授系统来动态构建语料库。可能是OpenNLP或StanfordNLP或任何其他。在我的学习和学习的限制范围内,NER对于英语类型的Resume / CV类型文档本身并不足够成熟。