如何使用 Spacy nlp custom ner 一次识别 2 种类型的文档

How to use Spacy nlp custom ner to identity 2 types of docs at once

我想制作一个 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"}
  ]
}

在此,我希望模型识别第一个文本的类型为“a”,因此应使用标签 FIRST 标记文本。同样,第二个文本的类型为“b”,因此它必须是 SECOND

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

您的数据描述有点模糊,但考虑到这些假设:

  1. 你不知道一个文件是A类还是B类,你需要分类。
  2. A 类和 B 类文档的 NER 完全不同。

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

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

您也可以单独训练模型并将它们组合在一个 spaCy 管道中,使用某种特殊组件来执行 NER 条件,但设置起来会非常棘手,所以我建议单独使用管道首先接近。

也就是说,根据您的问题,您可能不需要两个 NER 模型,并且两种类型文档的学习实体都会有效。因此,我还建议您尝试将所有训练数据放在一起,只训练一个 NER 模型,然后看看效果如何。如果可行,那么您可以拥有一个包含不直接相互交互的 textcat 和 NER 模型的管道。


为了回应评论,当我说“管道”时,我指的是语言对象,这就是 spacy.load returns。所以你使用配置训练模型,每个模型都在一个目录中,然后你这样做:

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 ...