Я пытаюсь создать куски существительных с помощью сопоставителя шаблонов 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