Как получить правильные pos-теги для предложения после слияния существительной? - PullRequest
2 голосов
/ 14 июня 2019

Я пытаюсь объединить куски именных фраз в предложение, а затем получить pos-теги для каждого токена в объединенном документе.Однако для каждого объединенного промежутка я, кажется, получаю тег pos первого токена в промежутке (обычно это DET или ADJ) вместо NOUN.

Вот код:

def noun_chunk_retokenizer(doc):
    with doc.retokenize() as retokenizer:
        for chunk in doc.noun_chunks:
            retokenizer.merge(chunk)
    return doc

nlp = spacy.load('en_core_web_sm')
nlp.add_pipe(noun_chunk_retokenizer)

query = "when is the tennis match happening?"
[(c.text,c.pos_) for c in nlp(query)]

Вот результат, который я получаю:

[('when', 'ADV'),
 ('is', 'VERB'),
 ('the tennis match', 'DET'),
 ('happening', 'VERB'),
 ('?', 'PUNCT')]

, но я ожидаю, что «теннисный матч» будет помечен как «НОУН», как это работает в демонстрационной версии дисплеев: https://explosion.ai/demos/displacy?

Кажется, должен быть "стандартный" способ сделать это, но я не уверен, как.

1 Ответ

1 голос
/ 14 июня 2019

Вы должны использовать встроенный merge_noun_chunks компонент . См. Функции конвейера Документация :

Объединение кусочков существительных в один токен. Также доступно через строковое имя "merge_noun_chunks". После инициализации компонент обычно добавляется в конвейер обработки с использованием nlp.add_pipe .

Пример использования с вашей строкой:

import spacy
nlp = spacy.load('en_core_web_sm')
nlp.add_pipe(nlp.create_pipe('merge_noun_chunks'))
query = "when is the tennis match happening?"
[(c.text,c.pos_) for c in nlp(query)]

Выход:

[('when', 'ADV'),
 ('is', 'VERB'),
 ('the tennis match', 'NOUN'),
 ('happening', 'VERB'),
 ('?', 'PUNCT')]

Что касается вопроса "как это делается в исходном коде", обратитесь к spacy Github repo , /spaCy/blob/master/spacy/pipeline/functions.py файлу в строке 7:

def merge_noun_chunks(doc):
    """Merge noun chunks into a single token.
    doc (Doc): The Doc object.
    RETURNS (Doc): The Doc object with merged noun chunks.
    DOCS: https://spacy.io/api/pipeline-functions#merge_noun_chunks
    """
    if not doc.is_parsed:
        return doc
    with doc.retokenize() as retokenizer:
        for np in doc.noun_chunks:
            attrs = {"tag": np.root.tag, "dep": np.root.dep}
            retokenizer.merge(np, attrs=attrs)
    return doc
...