python - 为什么 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
解决方案
自然语言模型,如 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 模型被混淆的原因。
边注
实际上,当我在我的机器上运行第一个提供的代码时,它会同时提取两者china
,japan
如下所示:
china GPE
japan GPE
推荐阅读
- r - 字幕长度加宽表 kable extra + 乳胶
- ruby-on-rails - 保存记录后调用带有 on create 选项的 Rails 嵌套属性自定义验证
- python - Pandas:合并两个数据框后如何防止科学记数法?
- python - 在 Python 中使用交集查找超过 1 个单词
- javascript - 使用 JavaScript 的连续日期之间的日期差异
- java - SQL中使用的本地日期java 8
- c# - 无论如何在 WPF 中模糊图像
- lua - 安装 lua 请求时出错
- javascript - 这个关键字在 node.js 中是如何工作的
- ios - Siesta 加载在陈旧资源上失败