我刚刚开始使用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模型可以工作吗?
目前,我采用策略来找到左边有东西的模式,右边有东西,按照这种方法我有80/85%找到实体。
示例:
Name: John
Birthdate: 2000-01-01
这意味着我在模式的左侧有“Name:”,右侧有 \ n (直到找到 \ n )。 我可以创建一个很长的模式列表。我想到了模式,因为我不需要在“其他”上下文中使用名称。
例如,如果用户在工作经历中写入其他名称,则不需要它们。因为我在寻找个人名字,而不是其他人。使用这种方法,我可以减少误报,因为我会查看特定的模式,而不是“一般名称”。
这种方法的一个问题是我有一个很大的模式列表(1个模式= 1个正则表达式),所以如果我添加其他模式,它就不能很好地扩展。
如果我可以训练一个具有所有这些模式的NER模型,它会很棒,但我应该使用大量的文档来训练它。
答案 0 :(得分:7)
案例1的传统(可能是最佳)方法是编写文档分段代码,而案例2是大多数系统的设计目标。您可以搜索谷歌学者的“文档细分”,以获得“最佳”方法的一些想法。最常见的(也是最容易实现的)是简单地使用正则表达式,如果文档结构一致,则可以非常有效。其他方法更复杂,但通常在文档结构更加多样化时需要。
您的NER管道至少需要:
答案 1 :(得分:7)
第一个案件可能是微不足道的,我同意Ozborn的建议。
我想就案例2提出一些建议 斯坦福NLP提供了一个优秀的英文名称识别器,但可能无法找到所有人名。 OpenNLP也提供了不错的表现,但比斯坦福要小得多。还有许多其他实体识别器可用于英语。我将重点关注StanfordNLP,这里有几点需要考虑。
公报。您可以为模型提供名称列表,还可以自定义“公报”条目的匹配方式。斯坦福在设置时还提供了草率匹配选项,允许与公报条目进行部分匹配。部分匹配应该适用于人名。
斯坦福大学建设性地认可实体。如果在文件中,有一个名字,如约翰特拉沃尔塔"被认可,然后它也会得到#Travolta"在同一份文件中,即使它没有关于"特拉沃尔塔"的事先没有想法。因此,尽可能多地在文档中附加信息。添加在case-1中识别的名称,在熟悉的上下文中,例如"我的名字是John Travolta。"如果"约翰特拉沃尔塔"被案例1中采用的规则所承认。添加虚假句子可以提高召回率。
制定培训基准是一个非常昂贵和枯燥的过程;你应该按照数万个句子的顺序进行注释,以获得不错的测试性能。我相信即使你有一个经过注释的训练数据训练的模型,性能也不会比你实施上述两个步骤更好。
<强> @edit 强>
由于这个问题的提问者对无监督的基于模式的方法感兴趣,我正在扩展我的答案来讨论这些问题。
当监督数据不可用时,通常使用称为引导模式学习方法的方法。该算法从一小组感兴趣的种子实例(如书籍列表)开始,并输出更多相同类型的实例 有关更多信息,请参阅以下资源
由于
答案 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类型文档本身并不足够成熟。