【问题标题】:change beam_width in spacy NER更改 spacy NER 中的 beam_width
【发布时间】:2019-02-18 08:58:22
【问题描述】:

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

我尝试了 nlp.entity.cfg.update({beam_width : 3}) 但看起来 nlp 的东西在这个改变之后被破坏了。 (如果我做一个 nlp(str),它会给我一个字典,而不是像往常一样的 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

光束宽度: 要考虑的替代分析的数量。越慢,也不一定越好——你需要在你的 问题。 (默认:1)

光束密度: 这会在每个步骤中剪辑解决方案。我们乘以 此值对排名靠前的动作的得分,并将结果用作 临界点。这可以防止解析器探索看起来像 不太可能,节省一点效率。精度也可以 改进,因为我们已经训练了贪婪的目标。 (默认:0)

我是 NLP 的新手,所以我不知道什么是具有全局目标的 Beam 搜索以及如何使用它,所以如果你能像我 5 岁那样解释我,那就太好了!

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

谢谢你的回答, 赫维。

【问题讨论】:

    标签: spacy


    【解决方案1】:

    (如果我执行 nlp(str),它会给我一个字典,而不是像往常一样的 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...嗯,它很复杂 :(。抱歉 --- 我没有方便的简单解释,这也是这些内部没有记录的原因之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 2023-03-07
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      相关资源
      最近更新 更多