Естественный язык синтаксический анализ назначения? - PullRequest
12 голосов
/ 06 апреля 2010

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

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

или

17:00. Счастливый час в пятницу

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

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

Ответы [ 3 ]

9 голосов
/ 07 апреля 2010

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

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

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

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

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

2 голосов
/ 12 апреля 2010

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

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

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

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

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

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

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

0 голосов
/ 07 апреля 2010

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

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

...