spaCy NER概率

时间:2017-10-25 14:02:27

标签: named-entity-recognition spacy

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

1 个答案:

答案 0 :(得分:5)

实际上,有一个issue

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

  
      
  1. 具有全局目标的光束搜索。   这是标准的解决方案:使用全局目标,以便对解析器模型进行训练,使其偏爱总体上更好的解析。保留N个不同的候选人,并输出最佳候选人。通过查看光束中的替代分析,可以将其用于支持置信度。如果每个分析中都存在一个实体,则NER更有把握地证明它是正确的。
  2.   

代码:

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,文本:美国