Как стать автором
Обновить

Комментарии 4

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

Есть пара вопросов. Был ли опыт работы со сленгом и табуированной лексикой? Можно ли вашу библиотеку портировать на другой язык, и насколько это трудоемко?
Здравствуйте,

Относительно сленга и другой подобной лексики. Для реализации морфологии есть два принципиально различных подхода: реализация на основе сделанного вручную словаря (типа словаря Зализняка и его производных, в том числе и АОТ) и реализация на основе статистики. Словарная морфология используется, например, в Яндексе. Вероятностные морфологические модели, насколько я слышал, используются в Google. Соответственно, для работы со сленгом необходимо выбрать один из этих подходов. Первый подход это расширение словаря (того же АОТ) вручную, добавление новых основе и парадигм склонения. Второй подход, построение моделей на основе размеченных текстов, таких текстов должно быть достаточно для построения модели.

Пополнение словаря — задача возникающая довольно часто. Нужен специальный инструмент (GUI) для пополнения, чтобы давал возможность добавить корень, выбрать парадигму склонения или добавить свою. Это инструмент для лингвистов — «рабочее место лингвиста». Хотя, конечно, если такой новой лексики относительно немного, то можно использовать и непосредственно разработчиков для пополнения словаря. Насколько я помню, в Яндексе именно так и делают.

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

Относительно портирования на другой язык, это зависит от того, какой язык Вам необходим. На сайте АОТ Вы можете найти ссылки на реализации морфологии на Java и python. Наверное есть и реализации на каких-то других языках. Библиотека Strutext была сделана специально для языка C++ и основана на специфических именно для этого языка подходах. Например, потоковая обработка текста с помощью итераторов — шаблонных классов, совместимых с STL итераторами. Возможность классификации символов в UNICODE по одному символу (в ICU для этого надо использовать сишные макросы, а модель классов — прямая калька от Java модели со всеми присущими недостатками). Легкие поточные перекодировщики для UTF-8 и однобайтовых кодировок. Ну и более сложные итераторы, итератор по словам, итератор по последовательностям слов, быстрый поиск наборов слов в тексте и т.п.
Спасибо за развернутый ответ! Есть ощущение, что если стоит задача сделать с нуля работающее решение, собрать словарь вручную будет быстрее.

А в плане портирования я вас, похоже, ввел в заблуждение. Я имел ввиду доработку для использования с другим естественным языком — английским, украинским, китайским, например. Нужно ли переделать только словарь, или потребуется вносить значительные изменения в код?
Английский словарь от АОТ тоже реализован в библиотеке. Немецкий вроде бы тоже был (не помню точно, у них или в другом месте). Кроме, собственно, словаря, необходимо еще реализовать модель синтаксических категорий. Скажем, для украинского кроме словаря основ и наборов склонений надо еще разработать модель синтаксических категорий (части речи, падежи, число, время и т.п.) и реализовать ее в C++. Можно и без категорий, но это уже будет обычный стеммер, т.е. будет возвращать основу без указания лексических атрибутов. В любом случае, здесь все зависит от задачи, есть много задач, для которых учет словоизменения не нужен, для других задач необходим только стеммер. Синтаксические категории используются в синтаксическом анализе, так что обычно необходимы для более глубокого анализа текста.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории