如何获得Spacy Ner概率 [英] How to get spaCy NER probability

查看:16
本文介绍了如何获得Spacy Ner概率的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将Spacy的NER引擎与单独的NER引擎(弓模型)结合在一起。我目前正在比较这两个引擎的输出,试图找出这两个引擎的最佳组合。两者都执行得很好,但Spacy经常会找到弓引擎遗漏的实体,反之亦然。我想要的是每当Spacy找到弓引擎没有找到的实体时,它都可以访问一个概率分数(或类似的东西)。我可以让Spacy为它找到的给定实体打印出自己的概率分数吗?比如,"嗨,我是Spacy。我找到了这个令牌(或令牌的组合),我可以肯定它是一个无关紧要的实体。"我想知道每次斯派西找到实体时的数字X。我想在Spacy的NER引擎内部一定有一个这样的数字,加上一个阈值,低于这个阈值的可能实体不会被标记为实体,我想知道如何获得这个数字。提前谢谢。

推荐答案

实际上,它有一个issue

图书馆的作者建议(除其他外)以下解决方案:

  1. 带全局目标的光束搜索。 这是标准的解决方案:使用全局目标,以便训练解析器模型以偏爱总体上更好的解析器。保留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))

示例输出:

实体和分数(使用BEAM搜索检测到)

标签:gpe,文本:日本,分数:0.9999999999999997

标签:gpe,文本:美国,分数:0.9991664575947963

重要说明:您在这里得到的输出可能不同于使用标准NER而不是BEAM搜索替代方案得到的输出。但是,BEAM搜索备选方案为您提供了一个信心指标,据我从您的问题中了解,该指标对您的情况很有用。

本例使用标准NER的输出:

标签:GPE,文本:日本

标签:org,文本:欧盟

标签:GPE,文本:美国

标签:GPE,文本:美国

这篇关于如何获得Spacy Ner概率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆