⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.
blog-post

Украинский лемматизатор теперь встроен в Manticore Search

Кратко

Начиная с релиза Manticore Search 25.7.1, украинский лемматизатор больше не требует отдельного Python-стека.
Раньше нужно было устанавливать отдельный пакет, Python 3.9, pymorphy2 и украинские словари.
Хорошая новость — теперь словарь уже входит в Manticore.

Достаточно только явно включить морфологию:

morphology='lemmatize_uk_all'

Для украинской морфологии важно не использовать голый non_cont: он сворачивает украинские і и ї в латинскую i ещё до запуска лемматизатора.
Поэтому в charset_table нужно явно сохранить і, ї и ґ, а также добавить украинские апострофы как часть слова.

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

Это всё, что нужно учесть для полноценной поддержки украинского в ManticoreSearch. Никаких словарей, пакетов или скриптов. Теперь всё работает прямо "из коробки"

Что такое лемматизатор

В полнотекстовом поиске часто нужно найти слово не только в той форме, которую ввёл пользователь. В документе может быть мрії, а пользователь ищет мрія. Или в тексте лежит інтернет-магазину, а запрос приходит как інтернет-магазин. Для человека это очевидно близкие формы. Для поискового движка без морфологии это разные токены.

Для этого в поисковых движках используют стемминг и лемматизацию.

Стеммер обычно работает по правилам: убирает или заменяет окончание. Это быстро, но результат бывает грубым и не всегда похож на настоящее слово.

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

Что изменилось

Если вы уже пробовали украинскую лемматизацию в Manticore, то могли упереться не в сам поиск, а в установку:

  • отдельный manticore-lemmatizer-uk;
  • Python 3.9 с --enable-shared;
  • pymorphy2 и pymorphy2-dicts-uk;
  • дополнительные системные зависимости.

Теперь украинский словарь поставляется как обычный языковой файл uk.pak, а Manticore загружает его нативно. С вашей стороны всё сводится к настройке таблицы: указываете нужную morphology и работаете дальше.

Минимальная конфигурация

Создадим таблицу для украинских текстов:

CREATE TABLE uk_docs(title text)
  morphology='lemmatize_uk_all'
  charset_table='non_cont,U+0406->U+0456,U+0456,U+0407->U+0457,U+0457,U+0490->U+0491,U+0491,U+2019->U+0027,U+02BC->U+0027,U+0027';

Здесь важно включить морфологию:

  • morphology='lemmatize_uk_all' включает украинский лемматизатор и индексирует все найденные нормальные формы.

Для украинского языка мы сохраняем кириллические і, ї и ґ, а также добавляем апостроф (U+0027) и типографские варианты (U+2019) и ʼ (U+02BC), чтобы слова вроде обов'язковим индексировались как один токен.

Если нужна только одна нормальная форма, используйте lemmatize_uk. Если хотите индексировать все возможные формы, используйте lemmatize_uk_all.

Проверим на примере

Добавим несколько документов:

INSERT INTO uk_docs VALUES
  (1, 'мрії про червону сукню'),
  (2, 'каталог інтернет-магазину'),
  (3, 'команд-учасниць запросили на зустріч');

Запрос мрія находит документ, где слово записано как мрії:

SELECT id, title FROM uk_docs WHERE MATCH('мрія') ORDER BY id ASC;
+------+---------------------------+
| id   | title                     |
+------+---------------------------+
|    1 | мрії про червону сукню    |
+------+---------------------------+

Запрос червоний находит червону:

SELECT id, title FROM uk_docs WHERE MATCH('червоний') ORDER BY id ASC;
+------+---------------------------+
| id   | title                     |
+------+---------------------------+
|    1 | мрії про червону сукню    |
+------+---------------------------+

А інтернет-магазин находит інтернет-магазину:

SELECT id, title FROM uk_docs WHERE MATCH('інтернет-магазин') ORDER BY id ASC;
+------+---------------------------+
| id   | title                     |
+------+---------------------------+
|    2 | каталог інтернет-магазину |
+------+---------------------------+

Что происходит с токенами

Если хочется посмотреть не только результат поиска, но и саму нормализацию, используйте CALL KEYWORDS:

CALL KEYWORDS(
  'мрії червона інтернет-магазину команд-учасниць',
  'uk_docs'
);
+------+--------------------+--------------+
| qpos | tokenized          | normalized   |
+------+--------------------+--------------+
| 1    | мрії               | мрія         |
| 2    | червона            | червоний     |
| 3    | інтернет           | інтернет     |
| 4    | магазину           | магазин      |
| 5    | команд             | команда      |
| 6    | учасниць           | учасниця     |
+------+--------------------+--------------+

Здесь видно главное отличие от простого отрезания окончаний: на выходе получаются нормальные формы слов, с которыми уже можно искать. мрії превращается в мрія, червона в червоний, магазину в магазин.

Что нужно помнить

Украинский лемматизатор стало проще использовать, но он не включается сам для любой таблицы. Нужно явно задать morphology.

Не используйте для украинской морфологии charset_table='non_cont,U+0027': такой вариант сворачивает і и ї в латинскую i, из-за чего лемматизатор получает уже искажённый токен. Для украинских текстов используйте вариант из примера выше, где і, ї и ґ явно сохранены.

Если вы используете официальные пакеты или образы Manticore Search актуальной версии, украинский uk.pak уже должен быть на месте. Если у вас собственная сборка или нестандартная раскладка файлов, проверьте, что lemmatizer_base указывает на каталог, где лежит uk.pak.

Подробнее о настройке морфологии можно прочитать в документации: morphology .

Установить Manticore Search

Установите Manticore Search одной командой в Linux или macOS:

curl https://manticoresearch.com | sh

Для расширенных вариантов установки см. полное руководство по установке и документацию .

Установить Manticore Search