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

Я делаю много обработки естественного языка с немного необычными требованиями. Часто я получаю задания, похожие на лемматизацию — по заданному слову (или просто фрагменту текста) мне нужно найти какие-то закономерности и как-то преобразовать слово. Например, мне может потребоваться исправить опечатки, например. данное слово «есть» мне нужно преобразовать его в «есть». Или мне может понадобиться преобразовать слова «ахахаха», «ахахахаха» и т. д. в просто «ахаха» и т. д.

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

 {w}in   ->  {w}ing
 aha(ha)+  ->  ahaha

То есть мне нужно иметь возможность использовать захваченные шаблоны с левой стороны на правой стороне.

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

Я делаю этот проект в Clojure, поэтому в идеале этот инструмент должен быть библиотекой для одного из языков JVM (Java, Scala, Clojure), но другие языки или инструменты командной строки тоже подходят.

Есть несколько очень крутых проектов НЛП, включая GATE, Stanford CoreNLP, NLTK и другие , и я не эксперт во всех из них, поэтому я мог пропустить там нужный мне инструмент. Если это так, пожалуйста, дайте мне знать.

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

UPD. Кажется, мне нужно дать больше деталей/примеров того, что мне нужно.

По сути, мне нужна функция для замены текста каким-либо регулярным выражением (аналогично String.replaceAll() в Java), но с возможностью использовать перехваченный текст в строке замены. Например, в реальном тексте люди часто повторяют символы, чтобы подчеркнуть определенное слово, например. кто-то может написать: «Этот фильм оооооооооооооооооооооооооо...». Мне нужно иметь возможность заменить эти повторяющиеся «оооо» только одним символом. Таким образом, может быть такое правило (по синтаксису, аналогичному тому, что я использовал ранее в этом посте):

{chars1}<char>+{chars2}?  ->  {chars1}<char>{chars2}

то есть заменить слово, начинающееся с некоторых символов (chars1), не менее 3 символов и, возможно, заканчивающееся некоторыми другими символами (chars2), на аналогичную строку, но только с одним . Ключевым моментом здесь является то, что мы цепляемся за левую часть правила и используем его в правой части.


person ffriend    schedule 10.03.2012    source источник
comment
Пожалуйста, не используйте здесь пошлости.   -  person Andrew Marshall    schedule 10.03.2012
comment
@AndrewMarshall: упомянутое слово является одним из наиболее часто употребляемых слов с ошибками в пользовательских текстах, таких как твиты, и, таким образом, это хороший пример. Но спасибо Гангадхару - он нашел еще один хороший пример, так что пошлости больше не надо.   -  person ffriend    schedule 10.03.2012
comment
Неважно, здесь это неуместно, и, очевидно, есть много других примеров, которые можно было бы использовать. Пожалуйста, воздержитесь от этого в будущем.   -  person Andrew Marshall    schedule 10.03.2012
comment
@AndrewMarshall: я с тобой не согласен. Это действительно не место для ругани между пользователями — я согласен с этим. Но программисты работают с реальным миром и всеми его неприятными вещами, и иногда эти вещи имеют значение. В частности, люди склонны скрывать в своих сообщениях вульгарные слова и, таким образом, намеренно писать их с ошибками. Более того, поскольку эти слова считаются плохими, они не включены во многие языковые ресурсы и, следовательно, не могут быть обнаружены при поиске по словарю - такие детали имеют прямое отношение к предмету. Но, конечно же, стоит свести количество таких случаев к минимуму.   -  person ffriend    schedule 10.03.2012


Ответы (2)


Я нашел http://userguide.icu-project.org/transforms/general чтобы быть полезным также для некоторых общих задач шаблона/преобразования, подобных этому, игнорируйте материал о транслитерации, это удобно для выполнения многих вещей.

Вы можете просто загрузить правила из файла в String и зарегистрировать их и т. д.

http://userguide.icu-project.org/transforms/general/rules

person Robert Muir    schedule 10.03.2012
comment
Интересный фреймворк, спасибо. Однако для моих задач он тоже слабоват. Мне нужно иметь возможность, по крайней мере, улавливать повторяющиеся шаблоны, такие как aha(ha)+ или l(o)+l (в синтаксисе регулярных выражений). - person ffriend; 12.03.2012
comment
Что ж, это все еще не соответствует всем моим потребностям (см. Мое обновление), но является наиболее близким инструментом, поэтому я принимаю этот ответ. - person ffriend; 13.03.2012

Я не эксперт в НЛП, но полагаю, что Snowball может вас заинтересовать. Это язык для представления алгоритмов стемминга. Его стеммер используется в поисковой системе Lucene.

person Samarth Bhargava    schedule 10.03.2012
comment
Спасибо за предложение - Snowball действительно хороший инструмент для манипуляций с окончаниями (например, -in -› ing). Однако он недостаточно гибок для других задач, таких как манипуляции с корнем (ахахахаха -> ахаха). - person ffriend; 12.03.2012