我想将spaCy的NER引擎与单独的NER引擎(BoW模型)结合起来。我目前正在比较两个引擎的输出,试图找出两者的最佳组合。两者都表现得不错,但很多时候spaCy会找到BoW引擎未命中的实体,反之亦然。我想要的是每当找到BoW引擎找不到的实体时,从spaCy访问概率分数(或类似的东西)。我可以让spaCy打印出自己找到的给定实体的概率分数吗?如同,"嗨,我是spaCy。我发现这个令牌(或令牌的组合),我确定X%是BLAH类型的实体。"每当spaCy找到一个实体时,我想知道数字X.我想在spaCy的NER引擎内部必须有一个这样的数字,加上一个阈值,低于该阈值可能的实体没有被标记为实体,我想知道如何开始那个数字。提前谢谢。
答案 0 :(得分:5)
实际上,有一个issue。
该库的作者(除其他外)建议以下解决方案:
- 具有全局目标的光束搜索。 这是标准的解决方案:使用全局目标,以便对解析器模型进行训练,使其偏爱总体上更好的解析。保留N个不同的候选人,并输出最佳候选人。通过查看光束中的替代分析,可以将其用于支持置信度。如果每个分析中都存在一个实体,则NER更有把握地证明它是正确的。
代码:
import spacy
import sys
from collections import defaultdict
nlp = spacy.load('en')
text = u'Will Japan join the European Union? If yes, we should \
move to United States. Fasten your belts, America we are coming'
with nlp.disable_pipes('ner'):
doc = nlp(text)
threshold = 0.2
(beams, somethingelse) = nlp.entity.beam_parse([ doc ], beam_width = 16, beam_density = 0.0001)
entity_scores = defaultdict(float)
for beam in beams:
for score, ents in nlp.entity.moves.get_beam_parses(beam):
for start, end, label in ents:
entity_scores[(start, end, label)] += score
print ('Entities and scores (detected with beam search)')
for key in entity_scores:
start, end, label = key
score = entity_scores[key]
if ( score > threshold):
print ('Label: {}, Text: {}, Score: {}'.format(label, doc[start:end], score))
示例输出:
实体和得分(通过波束搜索检测到)
标签:GPE,文字:日本,得分:0.9999999999999997
标签:GPE,文本:美国,得分:0.9991664575947963
重要提示::您将在此处获得的输出可能与使用标准NER(而不是光束搜索替代品)获得的输出不同。但是,光束搜索替代方案为您提供了一个置信度,据我从您的问题中了解到,该置信度对您的情况有用。
此示例的标准NER输出:
标签:GPE,文字:日本
标签:ORG,文本:欧盟
标签:GPE,文字:美国
标签:GPE,文本:美国