为什么 spacy ner 结果高度不可预测?

BAL*_*ALA 3 python nlp named-entity-recognition spacy

我尝试了 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_)
Run Code Online (Sandbox Code Playgroud)

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

案例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_)
Run Code Online (Sandbox Code Playgroud)

输出:

<spacy.lang.en.English object at 0x7f2213bde080>
china   GPE
East Asia   LOC
more than 14,000km   QUANTITY
Run Code Online (Sandbox Code Playgroud)

Anw*_*vic 6

自然语言模型,如 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
Run Code Online (Sandbox Code Playgroud)
  • “安华维克是巨大的”
>>> 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
Run Code Online (Sandbox Code Playgroud)
  • “安华维克太棒了”
>>> nlp = spacy.load("en_core_web_sm")
>>> sent = "Anwarvic is awesome"
>>> doc = nlp(sent)
>>> for i in doc.ents:
...     print(i.text," ",i.label_)
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,当 的上下文结构发生变化时,提取的实体也会发生变化Anwarvic。所以,第一句中的动词love对人们来说很常见。这就是为什么 spaCy 模型将其预测为PERSON. 同样的情况也发生在第二句话中,我们用它gigantic来描述诸如 之类的组织ORG。在第三句话中,awesome是一个非常通用的形容词,基本上可以用来描述任何事物。这就是 spaCy NER 模型令人困惑的原因。

边注

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

china   GPE
japan   GPE
Run Code Online (Sandbox Code Playgroud)