2014-03-21 3 views
1

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

Мужчина позвонил своей жене, прежде чем вернуться домой.

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

(TOP (S (NP (Д.Т.) (NN человек)) (VP (ВБД называется) (NP (PRP $ его) (NN жена)) (PP (IN перед) (S (VP (VBG)) (ADVP (RB back)))))) (. Home.)))

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

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

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

Спасибо!

ответ

1

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

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

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

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

+0

Что вы говорите правильно, я заметил, что деревья разбора иногда ошибочны или действительно сложны. Извлечение связей, вероятно, правильный путь, поэтому я попробую MaltParser. Я смотрел на него раньше, так как мне нужна библиотека, а не отдельное программное обеспечение. Спасибо, что указал мне в этом направлении. – Solipsy

+0

@ Солиспийцы Добро пожаловать! Однако вы можете использовать ReVerb в качестве библиотеки. Я использую его сейчас в проекте Java, и вам просто нужно установить его в файл pom (если вы используете Maven). Он напрямую интегрирует функции OpenNLP. – 5agado