为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

心有法竹 2023-05-23 16:17:55
我正在学习 spaCy 并且正在玩Matchers。我有:一个非常基本的句子(“白色牧羊犬”)匹配器对象,搜索模式(“white shepherd”)显示匹配项的打印件,以及该匹配项之前的单词和 POS我只是想检查如何处理我期望得到的索引超出范围异常,因为在匹配之前没有任何内容。我没想到它会起作用,但它确实起作用了,并且在比赛结束后返回“狗”……现在我很困惑。看起来 spaCy 使用循环列表(或者我认为的双端队列)?这需要一个语言模型来运行,如果你想重现它,你可以使用以下命令行安装它:python -m spacy download en_core_web_md这是代码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)       # 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有人可以解释发生了什么吗?谢谢 !
查看完整描述

1 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

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


查看完整回答
反对 回复 2023-05-23
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信