【问题标题】:Why spacy ner results are highly unpredictable?为什么 spacy ner 的结果是高度不可预测的?
【发布时间】:2019-11-03 04:38:23
【问题描述】:

我为 ner 尝试了 spacy,但结果非常不可预测。有时 spacy 无法识别特定国家/地区。谁能解释一下为什么会这样? 我尝试了一些随机的句子。

案例 1:

nlp = spacy.load("en_core_web_sm")
print(nlp)
sent = "hello china hello japan"
doc = nlp(sent)
for i in doc.ents:
  print(i.text," ",i.label_)

输出:在这种情况下没有输出。

案例 2:

nlp = spacy.load("en_core_web_sm")
print(nlp)
sent = "china is a populous nation in East Asia whose vast landscape encompasses grassland, desert, mountains, lakes, rivers and more than 14,000km of coastline."
doc = nlp(sent)
for i in doc.ents:
  print(i.text," ",i.label_)

输出:

<spacy.lang.en.English object at 0x7f2213bde080>
china   GPE
East Asia   LOC
more than 14,000km   QUANTITY

【问题讨论】:

  • 你用的是什么语言模型?你能给我们举个例子来说明它是如何不可预测的吗?你能提供你使用的代码吗?
  • 我编辑了问题,请再次检查。

标签: python nlp spacy named-entity-recognition


【解决方案1】:

自然语言模型,如 spaCy NER,从句子的上下文结构(周围的单词)中学习。这是为什么?让我们以单词Anwarvic 为例,它是一个您以前从未见过的新词,可能spaCy 模型以前也没有见过它。让我们看看当提供的句子发生变化时 NER 模型将如何行动:

  • “我爱安瓦尔维克”
>>> nlp = spacy.load("en_core_web_sm")
>>> sent = "I love Anwarvic"
>>> doc = nlp(sent)
>>> for i in doc.ents:
...     print(i.text," ",i.label_)
Anwarvic   PERSON
  • “Anwarvic 是巨大的”
>>> nlp = spacy.load("en_core_web_sm")
>>> sent = "Anwarvic is gigantic"
>>> doc = nlp(sent)
>>> for i in doc.ents:
...     print(i.text," ",i.label_)
Anwarvic   ORG
  • “Anwarvic 很棒”
>>> nlp = spacy.load("en_core_web_sm")
>>> sent = "Anwarvic is awesome"
>>> doc = nlp(sent)
>>> for i in doc.ents:
...     print(i.text," ",i.label_)

正如我们所见,当Anwarvic 的上下文结构发生变化时,提取的实体也会发生变化。因此,在第一句中,动词love 在人们中很常见。这就是 spaCy 模型将其预测为PERSON 的原因。第二句也是如此,我们使用gigantic 来描述像ORG 这样的组织。在第三句中,awesome 是一个非常通用的形容词,基本上可以用来描述任何事物。这就是 spaCy NER 模型被混淆的原因。

旁注

实际上,当我在我的机器上运行第一个提供的代码时,它会同时提取 chinajapan,如下所示:

china   GPE
japan   GPE

【讨论】:

    【解决方案2】:

    NER 通常是这样工作的:你让POS-Tagger 用词性标签(如动词、形容词和专有名词)标记你的句子。 NER 然后更直接地查看名词。正确分类 POS-tag 的信息越多,POS-Tagger 就越好。那就是更长的句子、语法正确的句子和正确的拼写。

    您的第一个示例sent = "hello china hello japan" 很短,没有动词等,这使得标注器很难对 POS-Tags 进行分类。并且缺少另一个信息:国家通常写成大写:尝试sent = "hello China hello Japan",它会起作用。

    在您的第二个示例中,即使是小写,模型也能正确检测到 china,因为整个句子中有更多信息。

    我建议你阅读更多关于 POS-Tagging 的内容,这很有趣!

    【讨论】:

      【解决方案3】:

      您的问题的第一个答案是上下文,并且已经被转发。这也与其他 NLP 库相同。

      第二个特定于 spaCy 的答案是不确定性。 spaCy 使用依赖于随机种子的各种内部组件。如this form post 所述,可能需要将 numpy 和 cupy 种子设置为最低限度以获得可预测的结果。很可能一台机器会给您提供与另一台具有相同代码的机器不同的输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-22
        • 2019-08-30
        • 2018-05-19
        • 2021-07-26
        • 1970-01-01
        • 2021-09-26
        • 2012-11-28
        相关资源
        最近更新 更多