Spacy Matcher - соответствует только самой длинной строке - PullRequest
0 голосов
/ 08 июля 2020

Я пытаюсь создать куски существительных с помощью сопоставителя шаблонов spacy. Например, если у меня есть предложение «Хоккейная схватка длилась несколько часов». Хочу вернуть «хоккейную схватку» и «часы». Сейчас у меня есть это:

from spacy.matcher import Matcher
nlp = spacy.load("en_core_web_sm")

matcher = Matcher(nlp.vocab)
matcher.add("NounChunks", None,  [{"POS": "NOUN"}, {"POS": "NOUN", "OP": "*"}, {"POS": "NOUN", "OP": "*"}] )

doc = nlp("The ice hockey scrimmage took hours.")
matches = matcher(doc)

for match_id, start, end in matches:
    string_id = nlp.vocab.strings[match_id] 
    span = doc[start:end]  
    print(match_id, string_id, start, end, span.text)

Но он возвращает все версии «хоккейной схватки», а не только самую длинную.

12482938965902279598 NounChunks 1 2 ice
12482938965902279598 NounChunks 1 3 ice hockey
12482938965902279598 NounChunks 2 3 hockey
12482938965902279598 NounChunks 1 4 ice hockey scrimmage
12482938965902279598 NounChunks 2 4 hockey scrimmage
12482938965902279598 NounChunks 3 4 scrimmage
12482938965902279598 NounChunks 5 6 hours

Что-то мне не хватает в том, как определить узор? Хочу вернуть только:

12482938965902279598 NounChunks 1 4 ice hockey scrimmage
12482938965902279598 NounChunks 5 6 hours

1 Ответ

1 голос
/ 08 июля 2020

Я не знаю встроенного способа отфильтровать самый длинный интервал, но есть служебная функция spacy.util.filter_spans(spans), которая помогает с этим. Он выбирает самый длинный промежуток среди заданных промежутков, и если несколько перекрывающихся промежутков имеют одинаковую длину, он дает приоритет промежутку, который появляется первым в списке промежутков.

import spacy 

from spacy.matcher import Matcher
nlp = spacy.load("en_core_web_sm")

matcher = Matcher(nlp.vocab)
matcher.add("NounChunks", None,  [{"POS": "NOUN", "OP": "+"}] )

doc = nlp("The ice hockey scrimmage took hours.")
matches = matcher(doc)

spans = [doc[start:end] for _, start, end in matches]
print(spacy.util.filter_spans(spans))

Выход

[ice hockey scrimmage, hours]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...