【问题标题】:Accessing out of range word in spaCy doc : why does it work?在 spaCy doc 中访问超出范围的单词:为什么它会起作用?
【发布时间】:2020-08-15 21:25:47
【问题描述】:

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

我有:

  • 一个非常基本的句子(“白牧羊犬”)
  • 一个匹配器对象,搜索一个模式(“白色牧羊人”)
  • 显示匹配的打印,以及匹配之前的单词和词性

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

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

有人能解释一下发生了什么吗?

谢谢!

【问题讨论】:

    标签: python nlp spacy matcher pos-tagger


    【解决方案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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2022-08-10
      • 2020-11-04
      • 2020-08-20
      • 1970-01-01
      • 2020-09-04
      相关资源
      最近更新 更多