如何解决访问spaCy doc中超出范围的单词:为什么起作用?
我正在学习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")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。