在 spaCy 文档中访问超出范围的词:为什么它有效?

Accessing out of range word in spaCy doc : why does it work?

我正在学习 spaCy 并且正在玩 Matchers

我有:

我只是想检查如何处理我期望得到的索引超出范围异常,因为在匹配之前没有任何内容。我没想到它会起作用,但它确实起作用了,并且正在返回 'dog',这是在比赛之后......现在我很困惑。

看起来 spaCy 使用循环列表(我认为是双端队列)?

这需要一个语言模型到运行,你可以使用以下命令行安装它,如果你想重现它:

python -m spacy download en_core_web_md

这是代码

import spacy
from spacy.matcher import Matcher 

# Loading language model
nlp = spacy.load("en_core_web_md")

# Initialising with shared vocab
matcher = Matcher(nlp.vocab)

# Adding statistical predictions
matcher.add("DOG", None, [{"LOWER": "white"}, {"LOWER": "shepherd"}])  # searching for white shepherd
doc = nlp("white shepherd dog")

for match_id, start, end in matcher(doc):
    span = doc[start:end]  
    print("Matched span: ", span.text)   
    # Get previous token and its POS
    print("Previous token: ", doc[start - 1].text, doc[start - 1].pos_) # I would expect the error here

我得到以下信息:

>>> Matched span:  white shepherd
>>> Previous token:  dog PROPN

谁能解释一下这是怎么回事?

谢谢!

您正在寻找索引 0-1 处的标记,该标记的计算结果为 -1,这是最后一个标记。

我建议使用 Token.nbor 方法查找跨度之前的第一个标记,如果不存在先前的标记,则将其设为 None 或空字符串。

import spacy
from spacy.matcher import Matcher 

# Loading language model
nlp = spacy.load("en_core_web_md")

# Initialising with shared vocab
matcher = Matcher(nlp.vocab)

# Adding statistical predictions
matcher.add("DOG", None, [{"LOWER": "white"}, {"LOWER": "shepherd"}])  # searching for white shepherd
doc = nlp("white shepherd dog")

for match_id, start, end in matcher(doc):
    span = doc[start:end]
    print("Matched span: ", span.text)
    try:
        nbor_tok = span[0].nbor(-1)
        print("Previous token:", nbor_tok, nbor_tok.pos_)
    except IndexError:
        nbor_tok = ''
        print("Previous token: None None")