Синтаксический анализ естественных языков назначения?

Я ищу библиотеку Java, чтобы помочь проанализировать вводимый пользователем текст, который представляет 'назначение' для календарного приложения. Например:

Ланч с Mike в 11:30 во вторник

или

17:00 Счастливого часа в пятницу

Я нашел, что некоторое обещание ведет как https://github.com/samtingleff/jchronic и http://www.datejs.com/, который может проанализировать даты - но я также должен смочь извлечь заголовок события как "Ланч с Mike".

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

12
задан nico.ruti 18 April 2012 в 10:05
поделиться

3 ответа

Расширение JChronic может быть вашим лучшим выбором. Я думаю, учитывая ответы на этот вопрос , маловероятно, что для этого существует предварительно созданная библиотека (хотя кажется, что такая вещь может быть полезна ... Я предполагаю, что основное использование - случаи для синтаксического анализа дат естественного языка были бы даже более полезными, если бы у них была возможность извлекать дополнительные данные из строк, предоставленных пользователем).

С точки зрения реализации, вероятно, наиболее простая вещь, которую нужно сделать, - это расширить JChronic, поскольку он поддерживает довольно значительную часть вашего варианта использования, но более , как вы можете видеть из модульного теста посторонняя информация уже должна игнорироваться фреймворком. К счастью, если вы посмотрите на основной класс , не должно быть слишком сложно расширить / изменить / обернуть метод parse () для поддержки настраиваемого сканера заголовка события. (Я лично предпочитаю обернуть фреймворк, а не разветвлять и модифицировать его, поскольку это позволяет вам легче извлекать выгоду из любых улучшений базового кода).

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

Ключ к успешной реализации этого, как и в любом проекте типа NLP, - иметь как можно больше примеров, предпочтительно в виде автоматических модульных тестов (в конечном итоге, даже если тестовые примеры test многократно дублируют одну и ту же функциональность, лучше иметь больше примеров, чем меньше). К счастью, поскольку мы говорим о естественном языке, такие тестовые примеры должно быть особенно легко получить, поскольку даже друзья, родственники и т. Д., Не являющиеся программистами, должны иметь возможность предоставить вам «описания событий» (или как вам угодно называть их). Вы также захотите особенно сосредоточиться на крайних случаях, когда бит анализа даты может мешать биту синтаксического анализа местоположения / заголовка (например, в «sigur rós at 8pm» «at» явно является частью времени, тогда как в «party» в субботу у Фиби "это явно не так".

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

9
ответ дан 2 December 2019 в 22:04
поделиться

Есть два относительно простых способа попытаться извлечь имена встреч.

Используйте пакет маркировки последовательностей

Если у вас есть помеченный набор данных, вы можете обучить модель последовательности, используя такие пакеты, как CRF ++ или Yamcha , чтобы вытащить названия встреч как "Обед с Майком".

Использование именованных сущностей и правил

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

Когда все именованные объекты помечены, будет довольно просто написать некоторые правила для извлечения или построения заголовков для каждой встречи.

Если вы ищете теггер NER на основе Java, вы можете использовать тот, который выпущен Стэнфорд , или тот, который распространяется с OpenNLP

2
ответ дан 2 December 2019 в 22:04
поделиться

Я не могу придумать ничего, что могло бы соответствовать вашим требованиям. Вы можете попробовать Java-пакет Stanford NLP или OpenNLP. Однако это может быть кувалдой к тому, что вы пытаетесь сделать.

Как вариант, вы можете попробовать разобрать его самостоятельно. Используйте JFlex для сканирования ввода и разметки и CUP для создания грамматики, если вы хотите обрабатывать больше ввода.

0
ответ дан 2 December 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: