Python 在spaCy文档中访问超出范围的单词:为什么它能工作?

Python 在spaCy文档中访问超出范围的单词:为什么它能工作?,python,nlp,spacy,matcher,pos-tagger,Python,Nlp,Spacy,Matcher,Pos Tagger,我在学spaCy,我在玩spaCy 我有: 一个非常基本的句子(“白色牧羊犬”) 匹配器对象,搜索模式(“白色牧羊犬”) 显示匹配项以及匹配前的单词和词组的打印 我只是想检查如何处理我期望得到的索引超出范围异常,因为在比赛之前没有任何异常。我没料到它会起作用,但它确实起作用了,并且在比赛结束后返回了“狗”。。。现在我很困惑 看起来spaCy使用的是循环列表(我想是deque) 这需要一个语言模型才能运行,如果您想复制它,可以使用以下命令行安装它: python-mspacy下载en\u co

我在学spaCy,我在玩spaCy

我有:

  • 一个非常基本的句子(“白色牧羊犬”)
  • 匹配器对象,搜索模式(“白色牧羊犬”)
  • 显示匹配项以及匹配前的单词和词组的打印
我只是想检查如何处理我期望得到的索引超出范围异常,因为在比赛之前没有任何异常。我没料到它会起作用,但它确实起作用了,并且在比赛结束后返回了“狗”。。。现在我很困惑

看起来spaCy使用的是循环列表(我想是deque)

这需要一个语言模型才能运行,如果您想复制它,可以使用以下命令行安装它:

python-mspacy下载en\u core\u web\u 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")

您正在索引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")