spaCy NER概率

Med*_*ede 9 named-entity-recognition spacy

我想将spaCy的NER引擎与单独的NER引擎(BoW模型)结合起来.我目前正在比较两个引擎的输出,试图找出两者的最佳组合.两者都表现得不错,但很多时候spaCy会找到BoW引擎未命中的实体,反之亦然.我想要的是每当找到BoW引擎找不到的实体时,从spaCy访问概率分数(或类似的东西).我可以让spaCy打印出自己找到的给定实体的概率分数吗?就像在,"嗨,我是spaCy.我发现这个令牌(或令牌的组合),我X%肯定是BLAH类型的实体." 每当spaCy找到一个实体时,我想知道数字X. 我想在spaCy的NER引擎内部必须有这样一个数字,加上一个阈值,低于该阈值可能的实体没有被标记为实体,我想知道如何获得这个数字.提前致谢.

gda*_*ras 6

实际上,有一个问题

该库的作者(除其他外)建议以下解决方案:

  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))
Run Code Online (Sandbox Code Playgroud)

样本输出:

实体和分数(通过波束搜索检测到)

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

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

重要说明:您将在此处获得的输出可能与使用标准NER(而不是光束搜索替代品)获得的输出不同。但是,光束搜索替代方案为您提供了一种置信度,据我从您的问题中了解到,该置信度对您的情况有用。

对于此示例,输出为标准NER:

标签:GPE,文字:日本

标签:ORG,文字:欧盟

标签:GPE,文字:美国

标签:GPE,文字:美国

  • 没有直接为我工作:我必须将 `(beams, Somethingelse) = ..` 更改为 `beams = ..` (2认同)
  • 对于现在发现此问题的任何人:请注意这在 v3 中不起作用。我们正在努力添加一个跨度分类器,让您以更简单的方式获得 NER 信心。https://github.com/explosion/spaCy/pull/6747 (2认同)