Пропустите слово внутри шаблона Python & spaCy - PullRequest
0 голосов
/ 31 января 2019

У меня есть это предложение:

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.')

Все, что я хочу, это убедиться, что слово «не» не существует между волей и внутри моего текста.Вот мой код:

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

Есть идеи, почему не работает?

1 Ответ

0 голосов
/ 02 февраля 2019

Ваш пример кода, кажется, пропускает оператор, который фактически выполняет сопоставление.Поэтому я добавил метод 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 (не приносящие доход расходы на покупку будут заморожены. ')

    с:

  • doc = nlp (не приносящие дохода расходы на заказ на покупку будут не заморожены. ')

У меня больше нет совпадений!

Я уменьшил сложность вашего паттерна - может быть, слишком сильно.Но я надеюсь, что смогу еще немного помочь.

...