为什么 spaCy 依存关系符号定义中的“case”和“compound”不像 spacy.symbols 包中的“nsubj”那样被识别?

4

问题:

spaCy的依赖符号“compound”和“case”报错为“未定义”,而“nsubj”被识别,尽管所有三个依赖符号在图形输出中都显示为活动状态。难道“from spacy.symbols import *”不应该像对“nsubj”等进行的定义那样定义所有符号吗?

spaCy文档

https://spacy.io/api/annotation#dependency-parsing 显示英语和通用标签依存关系集中都定义了“case”和“compound”。

环境

Windows 10;python 3.7.1;spaCy 2.3.1;使用Anaconda3环境;使用conda安装的包;在Jupyter中运行代码。在下面的代码后列出了所有安装的软件包。

代码示例

import spacy
from spacy import displacy
from spacy.symbols import *
nlp = spacy.load("en_core_web_sm")      # loaded the small model but also fails with the large model
doc = nlp("Autonomous family cars and people's drones are the future.")
displacy.render(doc, style='dep')       # draw a graph; shows dependencies assigned including 'compound' and 'case'

for t in doc:
    if t.dep == nsubj:                        # dependency 'nsubj' IS recognized
        print(f"Found nsub token")
    if t.dep == compound:                     # dependency 'compound' is NOT recognized
        print(f"Found compound token")
    if t.dep == case:                         # dependency 'case' is NOT recognized
        print(f"Found case token")
1个回答

1

你是正确的,symbols 模块不包含 casecompound。你可以使用以下代码查看所有符号:

from spacy import symbols
help(symbols)

这个问题的解决方法是将每个缺失依赖项的实际值存储到一个变量中。首先,让我们找到每个令牌的依赖标签及其编号:
import spacy
from spacy.symbols import *
nlp = spacy.load("en_core_web_lg")
doc = nlp("Autonomous family cars and people's drones are the future.")

for t in doc:
    print(t, t.dep_, t.dep)

现在我们知道了casecompound的实际值,我们可以为这些符号创建变量。
compound = 7037928807040764755
CASE = 8110129090154140942

原始代码现在将按预期工作。
for t in doc:
    if t.dep == nsubj:
        print("Found nsub token")
    if t.dep == compound:
        print("Found compound token")
    if t.dep == CASE:
        print("Found case token")

非常感谢您提供的解决方法以及快速明确的回复。 - Coder2000

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