Как получить глагол, соединяющий два существительных в дереве синтаксического анализа Apache OpenNLP?

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

Перед возвращением домой мужчина позвонил жене.

Учитывая входные данные «мужчина» и «жена», я хотел бы получить глагол «позвонить». OpenNLP дает мне дерево разбора:

(TOP (S (NP (DT The) (NN man)) (VP (VBD называется) (NP (PRP$ его) (NN жена)) (PP (IN перед) (S (VP (VBG идет) (ADVP ( РБ назад)))))(.домой.)))

Так что я думаю, что это, по крайней мере, частично вопрос навигации по дереву. Может быть, сначала изолировать все глаголы, а затем проверить их рекурсией вниз, пока в конце концов не будут найдены оба существительных?

Или попытаться найти кратчайший путь от одного существительного к другому и сохранить по пути глагол?

Моя проблема в том, что я недостаточно знаю структуру дерева синтаксического анализа, чтобы разработать хорошую стратегию. Или мне, возможно, следует использовать какой-то другой инструмент (Java)?

Спасибо!


person Solipsy    schedule 21.03.2014    source источник


Ответы (1)


Задача, которую вы хотите выполнить, действительно сложна. Самая большая проблема, которую я здесь вижу, связана с необходимостью получить «глагол, соединяющий два существительных». Это действительно общий подход, и, как вы, возможно, уже видели, деревья синтаксического анализа могут принимать очень разные (и даже «неправильные») структуры.

Если вам нужен более общий подход к проблеме, я бы посоветовал вам искать извлечение отношений. Этот метод направлен на извлечение бинарных (или n-арных) отношений из предложения. Примеры инструментов, которые я бы предложил:

С последним, например, вы можете извлечь из предложений отношения формы субъект-действие-объект. Что касается вашего вопроса, это будет работать, если два существительных являются соответственно подлежащим и объектом фразы.

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

person 5agado    schedule 31.03.2014
comment
То, что вы говорите правильно, я заметил, что деревья синтаксического анализа иногда ошибочны или очень сложны. Извлечение отношений, вероятно, правильный путь, поэтому я попробую MaltParser. Я смотрел на это раньше, так как мне нужна библиотека, а не отдельное программное обеспечение. Спасибо, что указали мне в этом направлении. - person Solipsy; 01.04.2014
comment
@Solipsy Добро пожаловать! Однако вы можете использовать ReVerb как библиотеку. Я использую его сейчас в моем проекте Java, и вам просто нужно установить его в файл pom (если вы используете Maven). Он напрямую интегрирует функциональность OpenNLP. - person 5agado; 01.04.2014