如何使用Spacy NLP自定义NER同时识别两种类型的文档

问题描述

我想创建一个Spacy NER模型,该模型根据文档类型识别和使用标记。

输入为json格式。示例-

{"text":{"a":"ABC DEF.","b":"CDE FG."},
  "annotations":[
    {"start":0,"end":3,"doc_type":"a","label":{"text":"FIRST"},"text":"ABC"}, 
    {"start":4,"end":6,"doc_type":"b","label":{"text":"SECOND"},"text":"FG"}
  ]
}
在此,我希望模型确定第一个文本的类型为&q;a&q;,因此文本应该首先使用标记进行标记。同样,第二个文本的类型为

我该如何着手解决这个问题?谢谢!


解决方案

您的数据描述有些含糊,但考虑到以下假设:

  1. 您不知道文档是A类型还是B类型,您需要对其进行分类。
  2. A类和B类单据的NER完全不同。

您应该做的是使用(最多)三个独立的空间管道。使用带有TextCAT模型的第一个管道将文档分类为A和B类型,然后为A类型文档提供一个用于NER的管道,为B类型文档提供一个管道。分类后,只需将文本传递到适当的NER管道。

这不是最高效的管道,但设置起来非常简单--您只需训练三个单独的模型,然后用一些胶水代码将它们粘合在一起。

您也可以单独训练模型,并将它们组合到一个空间管道中,使用某种特殊组件使NER的执行具有条件,但这将非常难以设置,因此我建议首先使用单独的管道方法。

也就是说,根据您的问题,您可能不需要两个NER模型,两种类型的文档的学习实体都是有效的。所以我也建议你试着把你所有的训练数据放在一起,只训练一个NER模型,看看效果如何。如果这样做有效,那么您可以拥有一个单独的管道,其中包含不直接相互交互的文本猫和NER模型。


为了回应这条评论,当我说<2-0]时,我指的是语言对象,它就是spacy.load返回的对象。因此,您使用配置训练模型,每个模型都在一个目录中,然后执行以下操作:

import spacy

classifier = spacy.load("classifier")
ner_a = spacy.load("ner_a")
ner_b = spacy.load("ner_b")

texts = ["I like cheese", ... raw texts ... ]

for text in texts:
    doc = classifier(text)
    if doc.cats["a"] > doc.cats["b"]:
        nerdoc = ner_a(text)
    else:
        nerdoc = ner_b(text)
    ... do something with the doc here ...

相关文章