我有这句话:
import spacy
nlp = spacy.load('en_core_web_sm')
from spacy.matcher import Matcher
matcher = Matcher(nlp.vocab)
doc = nlp(u'Non-revenue-generating purchase order expenditures will be frozen.')
我想要做的就是确保在意愿文本和我的文本之间不存在单词“ not”。这是我的代码:
pattern = [{'LOWER':'purchase'},{'IS_SPACE':True, 'OP':'*'},{'LOWER':'order'},{'IS_SPACE':True, 'OP':'*'},{"IS_ASCII": True, "OP": "*"},{'LOWER':'not', 'OP':'!'},{'LEMMA':'be'},{'LEMMA':'freeze'}]
我正在使用这个:
{'LOWER':'not', 'OP':'!'}
有人知道为什么不起作用吗?
答案 0 :(得分:0)
您的代码示例似乎丢失了实际执行匹配的语句。因此,我添加了方法“ matcher.add()”,该方法还通过调用自定义函数“ on_match”来详细说明匹配项。
但是更重要的是,我不得不更改样式,方法是省略空格部分{'IS_SPACE':True,'OP':'*'}以获得匹配。
以下是我的工作代码,可为我提供匹配:
import spacy
from spacy.matcher import Matcher
nlp = spacy.load('en_core_web_sm')
matcher = Matcher(nlp.vocab)
def on_match(matcher, doc, id, matches): # Added!
print("match")
# Changing your pattern for example to:
pattern = [{'LOWER':'purchase'},{'LOWER':'order'},{'LOWER':'expenditures'},{'LOWER':'not', 'OP':'!'},{'LEMMA':'be'},{'LEMMA':'freeze'}]
matcher.add("ID_A1", on_match, pattern) # Added!
doc = nlp(u'Non-revenue-generating purchase order expenditures will be frozen.')
matches = matcher(doc)
print(matches)
如果我替换:
doc = nlp(u'非收入采购订单支出将 被冻结。')
具有:
doc = nlp(u'非收入采购订单支出将 不被冻结。”)
我没有比赛了!
我降低了模式的复杂性-可能太多了。但我希望我能有所帮助。
答案 1 :(得分:0)
检查这个
"TEXT": {"NOT_IN": ["not"]}
见 “https://support.prodi.gy/t/negative-pattern-matching-regex/1764”