使用Spacy的doc.noun_chunks获取错误的名词短语

3
我使用spacy的en_core_web_trf和doc.noun_chunks来获取名词短语。之前,它运行得很好,我可以正确地获取名词短语。但最近,自2021年12月中旬左右(我猜测)以来,我使用相同的方法、相同的脚本,但无法正确获取名词短语。例如,在以下脚本中:
import spacy
from spacy import displacy

nlp = spacy.load("en_core_web_trf")
test_sen = "a label on a box that ensures that the status of a parcel can be traced uniquely "
doc = nlp(test_sen)
# ---------------------get initial noun chunks---------------------
for chunks in doc.noun_chunks:
    print(chunks)
# displacy.serve(doc, style='dep')

我得到了以下结果:
a label
a box
that
the status
a parcel

但是,根据依赖图(见下文),文本中的that(第一个)不应该是名词短语,但它被打印为名词短语。此外,根据这里的名词短语描述,它说Doc.noun_chunks:生成基本名词短语 Span 对象。在任何情况下,that都不应该是所谓的名词短语,但它在这里被识别为名词短语,并且它给我的后续处理带来了很多麻烦。
有没有人有关于如何修复它的提示?谢谢!

enter image description here


1
使用[chunks for chunks in doc.noun_chunks],我得到的输出是[一个标签,一个盒子,状态,一个包裹],没有that - Wiktor Stribiżew
@WiktorStribiżew 谢谢,我刚刚按照您的方式尝试了一下,“chunk = [chunks for chunks in doc.noun_chunks] print(chunk)”,但是“that”仍然被打印出来了,我不知道原因。 - Melina
1个回答

5
可能是因为使用了不同版本的en_core_web_trf导致差异。每个spaCy小版本都会推出一个新的模型版本,目前有三个模型版本:v3.0.0、v3.1.0和v3.2.0。您可以使用spacy validate命令查看当前安装的模型版本。
如果您需要针对特定任务获取完全相同的注释,请在您的要求中指定精确的模型版本。
https://github.com/explosion/spacy-models/releases/download/en_core_web_trf-3.1.0/en_core_web_trf-3.1.0-py3-none-any.whl

我认为你看到的差异是由于v3.2.0模型中对POS标签的改进所导致的,这些标签与细粒度标签和依存分析规则相映射。一些名词短语错误来自标记器/解析器的错误,但这里的标签、解析和POS看起来是正确的。名词短语的确切定义可能有所不同,但在我能找到的例子中(主要来自CoNLL 2003共享任务),像这样的关系代词被包括在名词短语中。


感谢@aab,也感谢提供前往3.1.0版本的链接。我还有一个非常基础的问题,我如何在安装en_core_web_trf时指定这个确切的版本?我只找到了安装命令“python -m spacy download en_core_web_trf”,而这个命令只能安装3.2.0版本。我尝试在末尾添加“==3.1.0”,但它不起作用。我可以先从链接下载包,然后手动本地安装吗?再次感谢! - Melina
"python -m spacy download en_core_web_trf-3.1.0" 也无法工作。 - Melina
1
spacy download 只会下载最新兼容的版本。使用 pip install URL 来从指定的规范安装。您也可以直接使用 pip 安装 .whl 文件。如果需要,pip 将升级/降级您的 venv 中的 spacy 以匹配模型。v3 模型在很大程度上是向前兼容的,但如果您真的想要每次获得完全相同的结果,则应始终使用相同的 spacy 版本。 - aab
谢谢@aab,你的解释非常清晰。现在它可以工作了,是的,我必须使用那个旧版本,因为如果我使用最新版本,它会对结果产生很大影响。 - Melina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接