在 spaCy 文档中访问超出范围的词:为什么它有效?
Accessing out of range word in spaCy doc : why does it work?
我正在学习 spaCy 并且正在玩 Matchers。
我有:
- 一个非常基本的句子(“白色牧羊犬”)
- 匹配器对象,搜索模式(“white shepherd”)
- 显示匹配项的打印,以及该匹配项之前的词和词性
我只是想检查如何处理我期望得到的索引超出范围异常,因为在匹配之前没有任何内容。我没想到它会起作用,但它确实起作用了,并且正在返回 '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")
我正在学习 spaCy 并且正在玩 Matchers。
我有:
- 一个非常基本的句子(“白色牧羊犬”)
- 匹配器对象,搜索模式(“white shepherd”)
- 显示匹配项的打印,以及该匹配项之前的词和词性
我只是想检查如何处理我期望得到的索引超出范围异常,因为在匹配之前没有任何内容。我没想到它会起作用,但它确实起作用了,并且正在返回 '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")