SyntaxNet создает дерево для корневого глагола

Я новичок в Python и в мире НЛП. Недавнее объявление о Syntaxnet от Google меня заинтриговало. Однако у меня много проблем с пониманием документации как по синтаксису, так и по связанным с ним инструментам (nltk и т. д.).

Моя цель: учитывая входные данные, такие как «Уилбур пнул мяч», я хотел бы извлечь корневой глагол (ударил ногой) и объект, который он относится к «мячу».

Я наткнулся на "spacy.io" и эта визуализация, кажется, инкапсулирует то, что я пытаюсь выполнить: POS пометить строку и загрузить ее в какую-то древовидную структуру, чтобы я мог начать с корневого глагола и пройти по предложению.

Я поиграл с синтаксической сетью/demo.sh и, как было предложено в thread закомментировал последние пару строк, чтобы получить вывод conll.

Затем я загрузил этот ввод в скрипт Python (сам собрался вместе, вероятно, неправильно):

import nltk
from nltk.corpus import ConllCorpusReader
columntypes = ['ignore', 'words', 'ignore', 'ignore', 'pos']
corp = ConllCorpusReader('/Users/dgourlay/development/nlp','input.conll', columntypes)

Я вижу, что у меня есть доступ к corp.tagged_words(), но нет связи между словами. Теперь я застрял! Как я могу загрузить этот корпус в древовидную структуру?

Любая помощь высоко ценится!


person Derek Gourlay    schedule 17.05.2016    source источник
comment
Мне кажется, вы пропустили часть синтаксического анализа. После того, как вы подготовите свои данные, т. Е. Токенизируете необработанный текст, тег POS и преобразуете его в формат conll, вам необходимо передать его анализатору (SyntaxNet в вашем случае). Затем вы можете сделать любой вид извлечения, который вы хотите, на выходе парсера.   -  person Riyaz    schedule 26.05.2016


Ответы (3)


Возможно, это было бы лучше в качестве комментария, но у меня еще нет необходимой репутации.

Раньше я не использовал ConllCorpusreader (не могли бы вы загрузить файл, который вы загружаете, в суть и предоставить ссылку? Это было бы намного проще протестировать), но я написал сообщение в блоге, которое может помочь с аспектом анализа дерева: здесь.

В частности, вы, вероятно, захотите разбить каждое предложение на части. Глава 7 книги NLTK содержит дополнительную информацию об этом, но это пример из мой блог:

# This grammar is described in the paper by S. N. Kim,
# T. Baldwin, and M.-Y. Kan.
# Evaluating n-gram based evaluation metrics for automatic
# keyphrase extraction.
# Technical report, University of Melbourne, Melbourne 2010.
grammar = r"""
NBAR:
  # Nouns and Adjectives, terminated with Nouns
  {<NN.*|JJ>*<NN.*>}

NP:
  {<NBAR>}
    # Above, connected with in/of/etc...
  {<NBAR><IN><NBAR>}
"""

chunker = nltk.RegexpParser(grammar)
tree = chunker.parse(postoks)

Примечание. Вы также можете использовать контекстно-свободную грамматику (описанную в главе 8).

Каждое разбитое на части (или проанализированное) предложение (или, в данном примере, словосочетание существительного, в соответствии с приведенной выше грамматикой) будет поддеревом. Чтобы получить доступ к этим поддеревьям, мы можем использовать эту функцию:

def leaves(tree):
  """Finds NP (nounphrase) leaf nodes of a chunk tree."""
  for subtree in tree.subtrees(filter = lambda t: t.node=='NP'):
    yield subtree.leaves()

Каждый из полученных объектов будет списком пар слово-тег. Отсюда вы можете найти глагол.

Затем вы можете поиграть с грамматикой выше или парсером. Глаголы разделяют именные группы (см. эту диаграмму в главе 7), так что вы, вероятно, можете просто получите доступ к первому NP после VBD.

Извините за решение, не относящееся к вашей проблеме, но, надеюсь, оно будет полезной отправной точкой. Если вы загрузите файл (ы), я сделаю еще один снимок :)

person Alex Bowe    schedule 26.05.2016

Вы пытаетесь найти зависимость, а именно dobj. Я еще недостаточно знаком с SyntaxNet/Parsey, чтобы рассказать вам, как именно извлечь эту зависимость из ее вывода, но я верю этому ответу может вам помочь. Короче говоря, вы можете настроить Parsey для использования синтаксиса ConLL для вывода, разобрать его на то, что вам будет легко пройти, затем искать зависимость ROOT, чтобы найти глагол, и зависимости *obj, чтобы найти его объекты.

person maga    schedule 22.05.2016
comment
Спасибо. Я полагаю, что часть, на которой я застрял, - это анализ вывода ConLL. Как вы можете видеть в моем примере выше, я загрузил его с помощью ConllCorpusReader, но я не могу понять, как пройти по нему как по дереву из корневого глагола. - person Derek Gourlay; 25.05.2016

Если вы проанализировали необработанный текст в формате conll с помощью любого синтаксического анализатора, вы можете выполнить шаги для обхода зависимостей интересующего вас узла:

  1. построить матрицу смежности из выходного предложения conll
  2. найдите интересующий вас узел (глагол в вашем случае) и извлеките его иждивенцы из матрицы смежности (индексы)
  3. для каждого зависимого найдите его метку зависимости в 8-м столбце в формате conll.

PS: Я могу предоставить код, но было бы лучше, если бы вы сами его закодировали.

person Riyaz    schedule 26.05.2016