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

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

我有:

  • 一个非常基本的句子(“白色牧羊犬”)

  • 匹配器对象,搜索模式(“white shepherd”)

  • 显示匹配项的打印件,以及该匹配项之前的单词和 POS

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

看起来 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

有人可以解释发生了什么吗?


谢谢 !


心有法竹
浏览 337回答 1
1回答

小怪兽爱吃肉

您在索引 0-1 处寻找一个评估为 -1 的标记,这是最后一个标记。我建议使用该Token.nbor方法在跨度之前查找第一个标记,如果不存在先前的标记,则将其设置为 None 或空字符串。import spacyfrom spacy.matcher import Matcher # Loading language modelnlp = spacy.load("en_core_web_md")# Initialising with shared vocabmatcher = Matcher(nlp.vocab)# Adding statistical predictionsmatcher.add("DOG", None, [{"LOWER": "white"}, {"LOWER": "shepherd"}])  # searching for white shepherddoc = 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")
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python