Сегодня мы хотим поговорить о том, почему поиск по китайскому тексту — непростая задача. В этой статье мы рассмотрим основные трудности реализации полнотекстового поиска для языков CJK и то, как их преодолеть с помощью Manticore Search.
Трудности поиска на китайском языке
Китайский язык принадлежит к так называемой языковой семье CJK (китайский, японский и корейский). Это, вероятно, самые сложные языки для реализации полнотекстового поиска, так как значения слов сильно зависят от многочисленных вариаций и последовательностей иероглифов, а символы не разделены на слова.
Специфика китайских языков:
- Китайские иероглифы не имеют прописных или строчных букв. У них есть только одно значение, независимо от контекста.
- Нет дополнительных украшений для букв, как, например, в арабском языке.
- Между словами в предложениях нет пробелов.
В чём же сложность? Чтобы находить точные совпадения при полнотекстовом поиске, нужно решить задачу токенизации: разбить текст на минимальные смысловые единицы, по которым пользователь сможет искать.
Токенизация китайского текста и сегментация слов
Говоря более конкретно, токенизация — это процесс превращения значимого фрагмента данных, например, слова, в уникальный идентификатор, называемый токеном, который представляет собой фрагмент данных в системе. В полнотекстовых поисковых системах токены служат ссылкой на оригинальные данные, но не могут быть использованы для угадывания этих фактических значений.
В большинстве языков мы используем пробелы или специальные символы для разделения текста на фрагменты. Однако в китайском и других языках CJK это невозможно из-за их морфологических свойств. Тем не менее сделать это всё равно нужно, и этот процесс называется сегментацией.
Другими словами, для китайского языка сегментация является предпосылкой для токенизации.
Вот пример, показывающий разницу между токенизацией на английском и китайском языках.

Как вы видите, китайское предложение вдвое короче и не имеет пробелов, запятых и даже не разделено на слова, каждое слово здесь представлено иероглифом или несколькими. Вот количественное сравнение:

Ещё одна проблема в том, что китайские иероглифы могут иметь разные значения в зависимости от их последовательности и сочетания. Рассмотрим, как меняется значение при разных сочетаниях иероглифов:

Здесь мы видим сочетание двух иероглифов «简单», что означает «простота», но если взять каждый иероглиф отдельно, у них будут другие значения: «简» (простой) и «单» (один)
В некоторых случаях, в зависимости от того, где вы ставите границу между словами, значения могут быть разными. Например:

Проблема, как вы можете видеть, заключается в том, что группа символов может быть сегментирована по-разному, что приводит к различным значениям.
Давайте рассмотрим возможные способы решения проблем токенизации/сегментации китайского языка.
Реализации
Существует несколько подходов к сегментации китайских текстов, но основные два:
- N-граммы: токенами считаются перекрывающиеся группы из «N» соседних китайских символов, где «N» может быть 1 - Uni; 2 - Bi; 3 - Tri; и так далее «-граммы».
- Основанный на словаре: выполняет сегментацию слов на основе словаря.
Самый простой способ сегментации китайского текста предполагает использование N-грамм. Алгоритм прост, но известно, что он не отличается качеством и даёт значительные накладные расходы, которые растут с увеличением длины обрабатываемого текста, поскольку каждая N-грамма является отдельным токеном, что делает словарь токенов больше и усложняет обработку поискового запроса. Исторически это был общий способ индексации текстов CJK в Manticore Search.
В Manticore Search 3.1.0 появился новый способ сегментации китайского текста на слова. Он основан на алгоритме сегментации текста ICU и реализует второй подход — сегментацию на основе словаря.
Преимущества использования ICU
ICU — это набор библиотек с открытым исходным кодом, предоставляющих поддержку Unicode и глобализации для программных приложений. Наряду со многими другими функциями, он решает задачу определения границ текста. Алгоритмы ICU определяют позиции слов, предложений, абзацев в пределах текста или определяют места, которые будут подходящими для переноса строк при отображении текста.
Алгоритм работы сегментации ICU в Manticore можно кратко описать следующим образом:
- Исходный текст рассматривается как массив символов.
- Затем Manticore проходит по массиву, и если находит набор китайских символов, передаёт его в библиотеку ICU для обработки.
- Сегментированные части китайского текста заменяют оригинальные, несегментированные части.
- Другие алгоритмы обработки естественного языка (charset_table , wordforms и т. д.) применяются к изменённому тексту, как в обычном процессе сегментации.
Чтобы включить сегментацию ICU-Chinese, необходимо установить следующие параметры конфигурации индекса:
morphology = icu_chinesecharset_table = cjk / chinese
Интерактивный курс
Попробуйте, как это работает, в нашем курсе
Вы можете узнать больше о токенизации китайского текста, если попробуете наш интерактивный курс «Токенизация текста ICU-Chinese», который включает командную строку для более удобного обучения.


