python spacy ищет два (или более) слова в окне - PullRequest
2 голосов
/ 01 июля 2019

Я пытаюсь определить понятия в текстах. Часто я считаю, что понятие появляется в тексте, когда два или более слов появляются относительно близко друг к другу. Например, понятие будет любым из слов лес , дерево , природа на расстоянии менее 4 слов от огонь , ожог , перегрев

Я изучаю простоту, и до сих пор я могу использовать такой подход:

import spacy
from spacy.matcher import Matcher
nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)
matcher.add("HelloWorld", None, [{"LOWER": "hello"}, {"IS_PUNCT": True}, {"LOWER": "world"}],[{"LOWER": "hello"}, {"LOWER": "world"}])

Это будет соответствовать Привет, мир и Привет, мир (или стрельба по дереву для приведенного выше примера)

Я ищу решение, которое дало бы совпадения слов Hello и World в пределах окна из 5 слов.

Я посмотрел на: https://spacy.io/usage/rule-based-matching

и описанные там операторы, но я не могу перевести этот подход «окно-слово» в «просторный» синтаксис.

Кроме того, я не могу обобщить это и на другие слова.

Есть идеи? Спасибо

1 Ответ

1 голос
/ 01 июля 2019

Для окна с K словами, где K относительно мало, вы можете добавить K-2 дополнительные жетоны подстановочных знаков между вашими словами. Подстановочный знак означает «любой символ», а в терминах Spacy это просто пустой диктант. Необязательно означает, что токен может присутствовать или отсутствовать, а в Spacy in кодируется как {"OP": "?"}.

Таким образом, вы можете написать свой сопоставитель как

import spacy
from spacy.matcher import Matcher
nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)
matcher.add("HelloWorld", None, [{"LOWER": "hello"}, {"OP": "?"},  {"OP": "?"}, {"OP": "?"}, {"LOWER": "world"}])

, что означает, что вы ищете «привет», затем от 0 до 3 токенов любого вида, затем «мир».Например, для

doc = nlp(u"Hello brave new world")
for match_id, start, end in matcher(doc):
    string_id = nlp.vocab.strings[match_id]
    span = doc[start:end]
    print(match_id, string_id, start, end, span.text)

будет напечатано

15578876784678163569 HelloWorld 0 4 Hello brave new world

И если вы хотите сопоставить и другой порядок (world??? Hello), вам нужно добавитьво-вторых, симметричный рисунок в ваш матчер.

...