Подтвердить что ты не робот

Естественный анализ языка встречи?

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

Обед с Майком в 11:30 во вторник

или

5 вечера Счастливый час в пятницу

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Существуют два относительно простых способа извлечения названий встреч.

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

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

Использовать именованные объекты и правила

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

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

Если вы ищете Java-маркер NER, вы можете использовать тот, который был выпущен Stanford или тот, который был распространен с помощью OpenNLP

Ответ 3

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

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