对模式和Python中的单词求反

时间:2019-01-31 18:43:09

标签: python nlp spacy

我有这句话:

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':'!'}

有人知道为什么不起作用吗?

2 个答案:

答案 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”