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

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

Кратко

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

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

morphology='lemmatize_uk_all'

Отдельно добавлять украинские символы в charset_table тоже уже не нужно: стандартный non_cont содержит маппинги для є, і, ї, ґ.
А вот апостроф для украинского языка важен, но здесь есть один важный нюанс. Если просто добавить его в 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+0027';

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

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

Для украинского языка добавляем только апостроф (U+0027), чтобы слова вроде обов'язковим индексировались как один токен.

Если нужна только одна нормальная форма, используйте 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 уже покрывает украинские символы є, і, ї, ґ. Если вы задаёте таблицу именно для украинских текстов, достаточно добавить к нему апостроф: charset_table='non_cont,U+0027'.

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

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

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

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