Совпадение с шаблоном на основе правил в spaCy возвращает идентификатор совпадения вместе с начальным и конечным символами совпадающего промежутка, но я не вижу ничего в документации, где говорится, как определить, какие частииз этого промежутка составляли токены, которые были сопоставлены.
В регулярных выражениях я могу ставить парены вокруг групп, чтобы выбирать их, а также "выбирать" и выводить из шаблона. Возможно ли это с помощью spaCy?
Например, у меня есть такой текст (от Дракулы):
Они были в высоких сапогах, с заправленными в них брюками и длинными черными волосами. и тяжелые черные усы.
И я определил эксперимент:
import spacy
from spacy.matcher import Matcher
def test_match(text, patterns):
nlp = spacy.load('en_core_web_sm')
matcher = Matcher(nlp.vocab)
matcher.add('Boots', None, patterns)
doc = nlp(text)
matches = matcher(doc)
for match in matches:
match_id, start, end = match
string_id = nlp.vocab.strings[match_id]
span = doc[start:end]
print(match, span.text)
text_a = "They wore high boots, with their trousers tucked into them, " \
"and had long black hair and heavy black moustaches."
patterns = [
{'POS': 'PRON'},
{'TAG': 'VBD'},
{'POS': 'ADJ'},
{'TAG': 'NNS'}
]
test_match(text_a, patterns)
Это выводит:
(18231591219755621867, 0, 4) They wore high boots
Для простого шаблона, подобного этому,с четырьмя жетонами подряд я могу предположить, что жетон 0 - это местоимение, жетон 1 - глагол прошедшего времени и т. д. Но для паттернов с модификаторами количества он становится неоднозначным. Но можно ли сделать так, чтобы spaCy сообщал мне, какие токены действительно соответствуют компонентам шаблона?
Например, возьмите эту модификацию, добавленную к эксперименту выше, с двумя подстановочными знаками в шаблоне и новой версией текстаотсутствует прилагательное «high»:
text_b = "They wore boots, with their trousers tucked into them, " \
"and had long black hair and heavy black moustaches."
patterns = [
{'POS': 'PRON'},
{'TAG': 'VBD'},
{'POS': 'ADJ', 'OP': '*'},
{'TAG': 'NNS', 'OP': '*'}
]
test_match(text_a, patterns)
print()
test_match(text_b, patterns)
Какие выходы:
(18231591219755621867, 0, 2) They wore
(18231591219755621867, 0, 3) They wore high
(18231591219755621867, 0, 4) They wore high boots
(18231591219755621867, 0, 2) They wore
(18231591219755621867, 0, 3) They wore boots
В обоих выходных случаях неясно, какой из окончательных токенов является прилагательным, а какой - существительным во множественном числе,Я полагаю, что могу перебрать токены в диапазоне, а затем вручную сопоставить их с частями поиска в шаблоне, но это однозначно повторяется. Поскольку я предполагаю, что spaCy должен найти их, чтобы они соответствовали им, разве он не может просто сказать мне, что именно?