SPACY 模式匹配中的否定运算符

问题描述 投票:0回答:2

我正在尝试在 spaCy 中编写一个与“黑色”匹配但不与“黑豆”匹配的模式。

我尝试了下面的代码,但它似乎与“black”旁边的标记匹配,只要它不是“bean”。如何修改以仅匹配“黑色”?

nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)

#pattern = [{"LOWER": "black"}, {"LEMMA": {"NOT_IN": ["bean", "beans"]}}]
pattern = [{"LOWER": "black"}, {"LEMMA": "bean", "OP": "!"}]
matcher.add("blackbeans", [pattern])

doc = nlp("I liked the black beans, but the avocado was black making the whole meal blackish-looking and not good.")

matches = matcher(doc)
for match_id, start, end in matches:
    string_id = nlp.vocab.strings[match_id]  # Get string representation
    span = doc[start:end]  # The matched span
    print(match_id, string_id, start, end, span.text)
python python-3.x spacy spacy-3
2个回答
1
投票

没有办法做到这一点 - 匹配器返回输入模式描述的每个标记。否定模式也不匹配非标记,因此如果“black”是句子中的最后一个标记,您的模式将会失败。

有几种方法可以解决这个问题:

  1. 您始终可以匹配“黑色”并对匹配进行后处理。这非常简单,尽管有些人不喜欢它,因为它不使用匹配器。
  2. 您可以使用匹配器的alignments功能,它告诉您每个标记匹配模式的哪一部分。这主要适用于比您现在使用的模式更复杂的模式。

0
投票

pattern = [{"LOWER": "black"}, {"LOWER": {"NOT_IN": ["bean", "beans"]}, "OP" : "?"}]

© www.soinside.com 2019 - 2024. All rights reserved.