在spaCy中包含字典(地名词典)以提高NER的理想方式是什么?

时间:2018-02-14 09:39:30

标签: python nlp named-entity-recognition spacy

我目前正致力于基于nltk实体提取和regexp匹配替换系统,其中我有几个命名的实体词典。字典实体都是常见类型(PERSON(雇员)等)以及自定义类型(例如SKILL)。我想使用预先训练好的spaCy模型并以某种方式包含我的词典,以提高NER的准确性。以下是我对可能方法的看法:

  • 使用spaCy的Matcher API,遍历字典并使用回调添加每个短语以添加实体?

  • 我刚刚找到了spacy-lookup,这似乎是一种简单的方法来提供匹配的长词/短语列表。

  • 但是,如果我想要模糊匹配怎么办?有没有办法直接添加到Vocab,因此通过Bloom过滤器/ n-gram单词向量进行一些模糊匹配,或者是否有一些适合这种需要的扩展?否则我想我可以复制spacy-lookup并用其他东西替换flashtext机器,例如Levenshtein距离。

  • 在玩spaCy的过程中,我尝试直接用字典中的单个单词训练NER(没有任何句子上下文),这样做了#34; work"。但是,当然,我必须非常谨慎地避免模型遗忘一切。

任何帮助表示感谢,我觉得这一定是一个非常普遍的要求,并且很想听听那些为那些人做得最好的事情。

2 个答案:

答案 0 :(得分:1)

我建议您查看spaCy的Entity Ruler。如果将现有字典转换为用于匹配的模式,则可以为每个实体和新类型添加规则。

这非常强大,因为您可以将其与标准spacy模型中可用的现有统计NER相结合,以实现您提到的某些“模糊匹配”。从文档中:

  

实体标尺旨在与spaCy的现有统计模型集成,并增强命名的实体识别器。如果将其添加到“ ner”组件之前,则实体识别器将尊重现有的实体跨度并围绕其调整其预测。在某些情况下,这可以显着提高准确性。如果是在“ ner”组件之后添加的,则实体标尺只会在文档模型与模型预测的现有实体不重叠的情况下才向文档中添加跨度。要覆盖重叠的实体,可以在初始化时设置overwrite_ents = True。

答案 1 :(得分:0)

我将Matcher与动态生成的回调一起使用。我认为效果很好。

我很好奇,为什么Matcher不支持模糊匹配,所以spacy的作者在一个封闭的问题上发现了this

  

您真的想预先计算搜索集,而不是在匹配器中即时进行搜索。一旦预先计算了相似度值,就可以在Matcher中使用扩展属性和> =比较来执行搜索。   我认为在这种情况下,实现的细节非常重要,而使它们模糊的API实际上将是不利的。

我认为这是一个好方法,它告诉您如何构建所需的内容。