Как «выбрать» части совпадения с шаблоном spaCy, а не все совпадение? - PullRequest
0 голосов
/ 11 октября 2019

Совпадение с шаблоном на основе правил в 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 должен найти их, чтобы они соответствовали им, разве он не может просто сказать мне, что именно?

...