如何获取spaCy NER概率

20

我想将spaCy的命名实体识别引擎与另一个识别引擎(一个词袋模型)结合起来。我目前正在比较两个引擎的输出,试图找出二者的最佳组合方式。这两个引擎表现都不错,但很多时候spaCy会发现识别引擎漏掉的实体,反之亦然。我想要的是在spaCy找到一个识别引擎未能发现的实体时,能够访问spaCy的概率分数(或类似内容)。我可以让spaCy在找到实体时打印自己的概率分数吗?例如,“嗨,我是spaCy,我发现了这个记号(或记号组合),我有X%的把握说它是类型为BLAH的实体。” 我希望每次spaCy找到实体时都能知道这个数字X。我想象中spaCy的NER引擎内部肯定存在这样一个数字,以及一个阈值,低于此阈值就不会标记为实体,我想知道如何获取这个数字。谢谢!


你想出了一种方法来做这件事吗? - randomSampling
很遗憾,我没有。 - Mede
2个回答

17

实际上,这个问题有一个问题报告

这个库的作者建议使用以下解决方案之一:

  1. 使用全局目标的波束搜索算法。 这是标准解决方案:使用全局目标,以便训练解析器模型更倾向于整体上更好的分析结果。保留N个不同的候选项,并输出最佳候选项。可以通过查看波束中的备选分析来支持置信度。如果一个实体在每个分析中都出现,则命名实体识别更有把握判断其正确性。

代码:

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

样例输出:

实体及其得分(使用beam search检测)

标签:GPE,文本:日本,得分:0.9999999999999997

标签:GPE,文本:美国,得分:0.9991664575947963

重要提示:在这里得到的输出可能与使用标准NER而不是beam search替代方法得到的输出不同。然而,从您的问题中我理解到,beam search替代方案提供了对置信度的度量,这对您的情况很有用。

此示例的标准NER输出:

标签:GPE,文本:日本

标签:ORG,文本:欧盟

标签:GPE,文本:美国

标签:GPE,文本:美国


1
太棒了,这肯定会派上用场。非常感谢! - Mede
1
我测试了你的代码,一切都运行良好。但是有一个奇怪的细节。我得到一个0.99分数的实体,它在doc.ents中没有显示。你知道为什么会出现这种情况吗? - Miguel
2
对我来说没有直接起作用:我不得不将(beams, somethingelse) = ..更改为beams = .. - MBT
2
对于现在发现这篇文章的任何人,请注意这在v3中不起作用。我们正在努力添加一个跨度分类器,让您以一种不那么hacky的方式获得NER置信度。https://github.com/explosion/spaCy/pull/6747 - polm23
@polm23,我猜你已经合并了获取置信度的新方法。你能否发一篇新答案? - Mutlu Simsek
我一度忘记了这个问题,但它出现在了SO侧边栏上,所以我添加了一个答案。 - polm23

2
从spaCy v3开始,推荐使用在这篇博客文章中介绍的spancat组件来完成此操作。虽然spancat体系结构的主要动机是允许更灵活的结构,例如重叠或嵌套注释,但它也具有更传统的评分机制,使得提供置信度值变得容易。您可以在这里阅读有关如何解释置信度值的信息(请注意,它们不会相加为1)。
如果你有NER训练数据,那么将其修改以用于训练spancat组件就很简单了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接