如何使用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;,因此文本应该首先使用标记进行标记。同样,第二个文本的类型为
我该如何着手解决这个问题?谢谢!
解决方案
您的数据描述有些含糊,但考虑到以下假设:
- 您不知道文档是A类型还是B类型,您需要对其进行分类。
- 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 ...
相关文章