如何使用 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
我该如何解决这个问题?谢谢!
您的数据描述有点模糊,但考虑到这些假设:
- 你不知道一个文件是A类还是B类,你需要分类。
- 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 ...
我想制作一个 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
我该如何解决这个问题?谢谢!
您的数据描述有点模糊,但考虑到这些假设:
- 你不知道一个文件是A类还是B类,你需要分类。
- 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 ...