在 resume/CV 中查找人名的 NER 模型是什么?

What does NER model to find person names inside a resume/CV?

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

不幸的是,我没有找到一个好的意大利语 ner 模型。我需要在 resume/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 模型可以在这种情况下工作吗?


编辑@vihari-piratla

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

示例:

Name: John
Birthdate: 2000-01-01

这意味着我在模式的左侧有 "Name:",在右侧有一个 \n(直到它找到 \n )。 我可以创建一长串类似的模式。我考虑模式是因为我不需要 "other" 上下文中的名称。

例如,如果用户在工作经历中写了其他名字,我不需要它们。因为我要找的是个人姓名,而不是其他人。使用这种方法我可以减少误报,因为我会查看特定模式而不是 "general names".

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

如果我能用所有这些模式训练一个 NER 模型,那就太棒了,但我应该使用大量文档来训练它。

案例 1 的传统(可能也是最佳)方法是编写文档分段代码,而案例 2 是大多数系统的设计目标。您可以搜索 google scholar for "document segmentation" 以获取有关 "best" 方法的一些想法。最常用(也是最容易做到)的方法是简单地使用正则表达式,如果文档结构一致,这会非常有效。其他方法更复杂,但当文档结构更加多样化时通常需要。

您的 NER 管道至少需要:

  1. Pre-processing / 文本标记化。从几个简单的开始 标记化规则
  2. 文档分割(冒号、破折号、点 headers、任何形式等)。为此,我将从正则表达式开始。
  3. 词性标记(最好使用现成的东西,比如 TreeTagger,它已经与意大利语一起使用)
  4. NER,MaxEnt 模型可以工作,一些重要的功能是大写、POS 标签和可能的字典功能(意大利电话簿?)。您将需要一些标记数据。

你可以使用 Stanford NLP.for 这里的示例是一些 python 使用 nltk 和 stanford mlp 库的代码

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

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

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

我想对case-2提出几点建议
Stanford NLP 提供了一个优秀的英文名字识别器,但可能无法找到所有的人名。 OpenNLP 也提供了不错的性能,但比斯坦福低得多。有许多其他实体识别器可用于英语。我将在这里重点介绍 StanfordNLP,这里有一些需要考虑的事项。

  1. 公报。您可以为模型提供名称列表,还可以自定义 Gazette 条目的匹配方式。斯坦福大学还提供了一个草率的匹配选项,当设置时,将允许与公报条目进行部分匹配。部分匹配应该与人名配合得很好。

  2. 斯坦福建设性地承认实体。如果在文档中识别出像 "John Travolta" 这样的名称,那么它也会在同一文档中得到 "Travolta",即使它事先不知道 "Travolta"。因此,请将尽可能多的信息附加到文档中。如果 "John Travolta" 被案例 1 中使用的规则识别,则在熟悉的上下文中添加案例 1 中识别的名称,例如 "My name is John Travolta."。添加虚拟句子可以提高召回率。

为培训制定基准是一个非常昂贵且无聊的过程;您应该按数万个句子的顺序进行注释,以获得良好的测试性能。我敢肯定,即使您使用带注释的训练数据训练模型,性能也不会比执行上述两个步骤时更好。

@edit

由于这个问题的提问者对无监督 pattern-based 方法感兴趣,我将扩展我的答案来讨论这些。

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

  • SPIED是一款使用above-described技术的软件,可供下载使用。
  • Sonal Gupta received Ph.D. on this topic, her dissertation is available here.
  • 有关此主题的简单介绍,请参阅这些 slides

谢谢

如果您正在谈论的是 resume/CV 类型的文档,那么最好的办法是构建一个语料库,或者从降低 "accuracy" 期望值开始,通过教导系统动态地构建语料库用户使用你的系统。可能是 OpenNLP 或 StanfordNLP 或任何其他。在我的 "learnings" 的限制范围内,NER 本身对于 Resume/CV 类型的英文类型文档来说还不够成熟。