在spacy NER中更改beam_width

时间:2018-09-13 15:18:07

标签: spacy

我想将nlp.entity.cfg beam_width(默认为1)更改为3。

我尝试了nlp.entity.cfg.update({beam_width:3}),但看起来在更改后nlp东西坏了。 (如果我执行nlp(str),它会给我一个dict而不是spacy.tokens.doc.Doc。如果我放置beam_width:1)

我想更改它,因为在我的情况下NER的概率会更准确(这是我自己训练的模型)。 我用在github.spacy / issues

中找到的代码来做probas
with nlp.disable_pipes('ner'):
    doc = nlp(txt)

(beams, somethingelse) = nlp.entity.beam_parse([ doc ], beam_width, beam_density)

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[(doc[start:end].text, label, start, end)] += score
  

beam_width:   要考虑的替代分析的数量。越多越慢,但不一定越好-您需要进行实验   问题。 (默认情况下:1)

     

beam_density:   这会在每个步骤中限制解决方案。我们乘以   根据该值对排名最高的操作进行评分,并将结果用作   阈。这样可以防止解析器探索看起来像的选项   不太可能,节省一点效率。准确性也可能   改进,因为我们已经训练了贪婪的目标。 (默认情况下:0)

我正在对NLP进行分类,所以我不知道什么是具有全局目标的Beam搜索以及如何使用它,因此,如果您能像我5岁那样向我解释一下,那就太好了!

我希望能够使用位移(style ='ent')来可视化Beam_width = 3的实体。

感谢您的回答, 埃尔维。

1 个答案:

答案 0 :(得分:1)

  

(如果我执行nlp(str),它会给我一个dict而不是spacy.tokens.doc.Doc,如果我把beam_width设置为:1)

我不确定为什么会这样。你确定吗?您使用什么版本?

我刚刚尝试了以下操作:

>>> import spacy
>>> nlp = spacy.load('en_core_web_md')
>>> nlp.entity.cfg['beam_width'] = 3
>>> doc = nlp(u'Hurrican Florence is approaching North Carolina.')
>>> doc.ents
(Hurrican Florence, North Carolina)
>>> nlp.entity.cfg['beam_width'] = 300
>>> doc = nlp(u'Hurrican Florence is approaching North Carolina.')
>>> doc.ents
(Hurrican Florence is approaching, North Carolina.)

如您所见,设置非常宽的光束会导致准确性下降,因为默认模型没有经过训练可以使用这样的宽光束。

至于ELI5 ...好吧,这很复杂:(。对不起---我没有一个简单的解释,这是内部文件未公开的原因之一。