При создании поискового решения разработчику в первую очередь приходится иметь дело с предварительной обработкой текста.
Разбивка по терминам, фильтрация стоп-слов.
Важной операцией, влияющей на качество поиска на этом этапе, является приведение слов к нормальной форме.
Ниже приведены основные подходы к этой проблеме.
В простейшем случае вы можете использовать оператор усечения (стемминг) , при котором отбрасываются окончания и остается основная форма слова.
Самым популярным решением для английского языка является стеммер от Снежный шар .
Он основан на нескольких простых правилах.
Например, если s — последняя буква в слове, то ее можно отбросить.
Вот пример того, как это работает на английском языке: комментарии -> комментарий используя -> использовать стемлинг -> стебель получено -> получить развивается -> развивается.
Хоть Snawball и поддерживает русский язык, его использование не дает достаточно качественных результатов.
Вот пример двух словоформ одного и того же слова, у которых усечение происходит по-разному: обзор -> обзор отзывы -> обзор Другой подход — хранить все пары (слово, нормальная форма).
Недостатки здесь очевидны.
Если встретилось незнакомое слово, алгоритм для него не сработает. Другой недостаток возникает из-за того, что современный словарь русского языка содержит более полутора миллионов словоформ.
Все их нужно хранить и быстро искать среди них.
Вы можете построить конечный автомат, чтобы уменьшить объем необходимой памяти и увеличить скорость работы.
Алгоритм построения такого автомата приведен в статье [1].
Реализация на C++ доступна на сайте aot.ru. Этот алгоритм довольно сложен в реализации.
Вы можете использовать гибридную версию стемминга и словарного подхода.
В большинстве случаев знания нескольких последних букв слова нам будет достаточно, чтобы правильно определить его нормальную форму.
Таким образом, мы заменяем пары (слово, нормальная форма) на (окончание слова, окончание нормальной формы).
За окончание слова возьмем последние 7 букв слова.
Это решило проблему отсутствия незнакомых слов в словаре.
Понятно, что этот результат будет хуже словарного, но значительно лучше результата стеммера.
Для слова, состоящего не более чем из 7 букв, алгоритм даст точный ответ. Также используется при реализации морфологии от aot.ru как эвристика незнакомых слов.
Отличие реализации в том, что конечная машина строится так же, как и для слов из словаря.
Рассмотрим вопрос ее сложности и необходимого объема памяти.
В русском алфавите 33 буквы плюс В, также нужно учитывать, что слова могут содержать дефис.
Таким образом, одна буква в слове кодируется числом от 0 до 33, а 64-битный тип данных (например long в Java) может содержать информацию о 7-12 буквах.
Для наших целей этого вполне достаточно.
Для эксперимента возьмем словарь с сайта проекта aot.ru, распространяемый по лицензии LGPL 2.0. Он даст нам 750 тысяч уникальных пар (окончание слова, окончание нормальной формы).
В некоторых парах будут одинаковые окончания слов, для которых нужно определить нормальную форму.
Оставим только один – который более употребителен и подходит для более распространенных слов в русском языке.
Таким образом у нас останется около 690 тысяч пар.
В частности, для более чем 600 тысяч случаев нормальная форма будет определена однозначно.
Несложно подсчитать, что данные, необходимые для работы алгоритма, займут около 10,6 мегабайт. Нужную концовку можно найти с помощью бинарного поиска.
(нужно найти около 20 сравнений).
Для сравнения, в алгоритме от aot.ru размер машины без морфологической информации около 5 мегабайт. Для реализации эвристики в конце слова нужна еще одна машина, к сожалению ее размер не указан.
Таким образом, объем памяти сопоставим, и данная реализация не дает существенно худших результатов при меньших затратах.
Выполнение Этот подход был реализован в Java, а также был сделан Анализатор русского языка.
для системы поиска люцена .
Распространяется по лицензии Apache 2.0. [1] Ян Дачук, Брюс Уотсон и Ричард Уотсон, Инкрементное построение минимальных ациклических автоматов и преобразователей с конечным состоянием, труды по методам конечных состояний в обработке естественного языка, стр.
48-56, Университет Билкент, Анкара, Турция, 29 июня - 1 июля 1998 года.
Гибридная реализация русской морфологии.
Теги: #java #nlp #морфология #лингвистика #Чулан
-
Обзор Разработки Веб-Приложений.
19 Oct, 24 -
Мировая Атомная Энергетика В 2018 Году
19 Oct, 24 -
Обесценивание Персональных Данных
19 Oct, 24 -
Рабочий День С Htc Desire Hd
19 Oct, 24 -
Блендер, 1001 Мелочь
19 Oct, 24