首页 > 解决方案 > 为什么 spacy ner 的结果是高度不可预测的?

问题描述

我为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_)

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

案例二:

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

标签: pythonnlpspacynamed-entity-recognition

解决方案


自然语言模型,如 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
  • “安瓦尔维奇是巨大的”
>>> 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
  • “安华维奇太棒了”
>>> 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

推荐阅读