Звучит как хороший пример использования сопоставления на основе правил .Это особенно эффективно в сценарии, подобном вашему, где вы можете объединить статистические модели (например, существительные куски, основанные на тегах и зависимостях части речи) с вашими собственными правилами для охвата оставшихся конкретных случаев.
Вотпростой пример:
import spacy
from spacy.matcher import PhraseMatcher
nlp = spacy.load("en_core_web_sm")
matcher = PhraseMatcher(nlp.vocab)
# This is just an example – see the docs for how to do this more elegantly
matcher.add("PHRASES", None, nlp("ANOVA"), nlp("analysis of variance"))
doc = nlp("A text about analysis of variance or ANOVA")
matches = matcher(doc)
for match_id, start, end in matches:
matched_span = doc[start:end]
print(matched_span.text)
# analysis of variance
# ANOVA
Индекс совпадений start
и end
позволяет создать диапазон - так что в итоге вы получите Span
объекты, точно так же, как те, которые были возвращены doc.noun_chunks
.Если вы хотите решить эту проблему еще более элегантно, вы также можете добавить пользовательский атрибут , такой как doc._.custom_noun_chunks
, который запускает сопоставление на Doc
и возвращает сопоставленные отрезки или даже сопоставленные отрезки плюс оригинальные куски существительного.
Кстати, doc.noun_chunks
основаны на тегах части речи и разборе зависимостей.Вы можете проверить код для того, как они вычисляются на английском языке здесь .В то время как вы могли бы теоретически улучшить фрагменты существительных путем точной настройки тегера и синтаксического анализатора, этот подход кажется излишним и гораздо более умозрительным для вашего варианта использования.Если у вас уже есть список фраз, вы можете сопоставить его напрямую.