Я делаю много обработки естественного языка с немного необычными требованиями. Часто я получаю задания, похожие на лемматизацию — по заданному слову (или просто фрагменту текста) мне нужно найти какие-то закономерности и как-то преобразовать слово. Например, мне может потребоваться исправить опечатки, например. данное слово «есть» мне нужно преобразовать его в «есть». Или мне может понадобиться преобразовать слова «ахахаха», «ахахахаха» и т. д. в просто «ахаха» и т. д.
Поэтому я ищу какой-нибудь универсальный инструмент, позволяющий определять правила преобразования для таких случаев. Правила могут выглядеть примерно так:
{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
), на аналогичную строку, но только с одним . Ключевым моментом здесь является то, что мы цепляемся за левую часть правила и используем его в правой части.