簡體   English   中英

spaCy:自定義屬性不正確匹配?

[英]spaCy: custom attributes not matching correctly?

使用自定義擴展屬性和最近改進的Matcher(spaCy 2.012)時遇到問題。 即使是一個簡單的示例(通常是從此處復制)也無法按我預期的那樣工作:

import spacy
from spacy.tokens import Token
from spacy.matcher import Matcher

nlp = spacy.load('en')
text = 'I have apple. I have had nothing.'
doc = nlp(text)


def on_match(matcher, doc, id, matches):
    print('Matched!', matches)


Token.set_extension('is_fruit', getter=lambda token: token.text in ('apple', 'banana'))
pattern1 = [{'LEMMA': 'have'}, {'_': {'is_fruit': True}}]
matcher = Matcher(nlp.vocab)
matcher.add('HAVING_FRUIT', on_match, pattern1)
matches = matcher(doc)
print(matches)

這給出以下輸出:

[(13835066833201802823, 1, 2), (13835066833201802823, 5, 6), (13835066833201802823, 6, 7)]

換句話說,規則在跨度“ have”(1,2)上正確匹配,但是在“ have”(5,6)和“ had”(6,7)上正確匹配。 此外,不調用回調函數。 自定義屬性似乎被忽略。

當我添加新模式時,如下所示:

Token.set_extension('nope', default=False)
pattern2 = [{'LEMMA': 'nothing'}]
matcher.add('NADA', on_match, pattern2)

matches = matcher(doc)
print(matches)

我得到以下輸出:

[(12682145344353966206, 1, 2), (12682145344353966206, 5, 6), (12682145344353966206, 6, 7)]
Matched! [(12682145344353966206, 1, 2), (12682145344353966206, 5, 6), (12682145344353966206, 6, 7), (5033951595686580046, 7, 8)]
[(12682145344353966206, 1, 2), (12682145344353966206, 5, 6), (12682145344353966206, 6, 7), (5033951595686580046, 7, 8)]

第一條規則如上所述。 然后,第二個規則以及回調函數(將打印消息)一起觸發。 新模式還有一個附加的正確匹配項,以及第一個規則中的正確和錯誤匹配項。

因此,我有幾個問題:

  1. 為什么pattern1不正確匹配? (即為什么_自定義屬性約束不適用?)
  2. 為什么回調函數在第一次調用時不起作用?
  3. 為什么在添加新規則后有效?

在我自己的代碼中,當使用自定義屬性作為后續模式中的約束時,這些模式在所有令牌上都匹配。 我認為這與上面的代碼顯示的行為有關。

抱歉,這很令人困惑–但是您所指的GitHub線程仍然只是spec和proposal ,即計划的實現。 希望這些更改將隨spaCy v2.1.0一起提供(因為對Matcher內部的某些更改不完全向后兼容)。

雖然自定義屬性的匹配還沒有實現,到基本的改進Matcher引擎已經可以在develop通過分支,並在alpha版本spacy-nightlypip install spacy-nightly )。 這些更新還可能解決您在回調函數中觀察到的不一致行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM