Продвинутая морфология

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

В Manticore есть четыре встроенных морфологических препроцессора:

  • Лемматизатор: сводит слово к корню или лемме. Например, "running" может быть приведено к "run", а "octopi" — к "octopus". Обратите внимание, что у некоторых слов может быть несколько соответствующих корневых форм. Например, "dove" может быть либо прошедшей формой глагола "dive", либо существительным, обозначающим птицу, как в предложении "A white dove flew over the cuckoo's nest." В таком случае лемматизатор может сгенерировать все возможные корневые формы.
  • Стеммер: сводит слово к основе, удаляя или заменяя известные суффиксы. Полученная основа может не быть валидным словом. Например, английский стеммер Портера сводит "running" к "run", "business" к "busi" (не валидное слово) и вообще не изменяет "octopi".
  • Фонетические алгоритмы: заменяют слова на фонетические коды, которые одинаковы, даже если слова различаются, но звучат похоже.
  • Алгоритмы разбиения слов: разбивают текст на слова. В настоящее время доступны только для китайского языка.

morphology

morphology = morphology1[, morphology2, ...]

Директива morphology задаёт список морфологических препроцессоров, применяемых к индексируемым словам. Это необязательная настройка, по умолчанию препроцессоры не применяются.

Manticore включает встроенные морфологические препроцессоры для:

  • английского, русского и немецкого языков (лемматизаторы)
  • английского, русского, арабского и чешского (стеммеры)
  • фонетических алгоритмов SoundEx и MetaPhone
  • алгоритма разбиения слов для китайского языка
  • стеммеров Snowball (libstemmer) более чем для 15 других языков.

Лемматизаторы требуют словарных файлов .pak, которые можно установить с помощью пакетов manticore-language-packs или скачать с сайта Manticore. В последнем случае словари нужно положить в директорию, указанную в настройке lemmatizer_base.

Кроме того, настройка lemmatizer_cache может быть использована для ускорения лемматизации за счёт выделения большего объёма оперативной памяти для кэша распакованного словаря.

Сегментация языка китайского может выполняться с помощью ICU или Jieba (требуется пакет manticore-language-packs). Обе библиотеки обеспечивают более точную сегментацию, чем n-граммы, но работают немного медленнее. В charset_table должны быть включены все китайские символы, что можно сделать с помощью наборов символов cont, cjk или chinese. При установке morphology=icu_chinese или morphology=jieba_chinese документы сначала обрабатываются ICU или Jieba. Затем токенизатор обрабатывает результат в соответствии с charset_table и, наконец, применяются другие морфологические препроцессоры из опции morphology. Для сегментации ICU/Jieba передаются только те части текста, которые содержат китайский язык, тогда как другие части могут быть изменены другими способами, например, различными морфологиями или с помощью charset_table.

Встроенные английский и русский стеммеры работают быстрее своих аналогов из libstemmer, но могут выдавать немного отличающиеся результаты.

Реализация Soundex совпадает с реализацией в MySQL. Реализация Metaphone основана на алгоритме Double Metaphone и индексирует первичный код.

Для использования опции morphology укажите один или несколько из встроенных вариантов, в том числе:

  • none: не применять морфологическую обработку
  • lemmatize_ru - применять русский лемматизатор и выбирать одну корневую форму
  • lemmatize_uk - применять украинский лемматизатор и выбирать одну корневую форму (сначала установите его в Centos или Ubuntu/Debian). Для корректной работы лемматизатора убедитесь, что специфические украинские символы сохранены в вашем charset_table, так как по умолчанию они отсутствуют. Для этого переопределите их, например: charset_table='non_cont,U+0406->U+0456,U+0456,U+0407->U+0457,U+0457,U+0490->U+0491,U+0491'. Здесь находится интерактивный курс по установке и использованию украинского лемматизатора.
  • lemmatize_en - применять английский лемматизатор и выбирать одну корневую форму
  • lemmatize_de - применять немецкий лемматизатор и выбирать одну корневую форму
  • lemmatize_ru_all - применять русский лемматизатор и индексировать все возможные корневые формы
  • lemmatize_uk_all - применять украинский лемматизатор и индексировать все возможные корневые формы. Ссылки на установку приведены выше, а также обратите внимание на charset_table.
  • lemmatize_en_all - применять английский лемматизатор и индексировать все возможные корневые формы
  • lemmatize_de_all - применять немецкий лемматизатор и индексировать все возможные корневые формы
  • stem_en - применять английский стеммер Портера
  • stem_ru - применять русский стеммер Портера
  • stem_enru - применять английский и русский стеммеры Портера
  • stem_cz - применять чешский стеммер
  • stem_ar - применять арабский стеммер
  • soundex - заменять ключевые слова их SOUNDEX-кодом
  • metaphone - заменять ключевые слова их METAPHONE-кодом
  • icu_chinese - применять сегментацию китайского текста с использованием ICU
  • jieba_chinese - применять сегментацию китайского текста с использованием Jieba (требуется пакет manticore-language-packs)
  • libstemmer_* . Смотрите список поддерживаемых языков в списке поддерживаемых языков для детализации

Несколько стеммеров могут быть указаны, разделённые запятыми. Они будут применяться к входящим словам в том порядке, в котором перечислены, и обработка остановится, как только один из стеммеров изменит слово. Кроме того, при включённой функции wordforms, сначала будет осуществлён поиск слова в словаре словоформ. Если в словаре найдётся совпадающая запись, применение стеммеров не происходит. Функция wordforms может использоваться для реализации исключений стемминга.

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • CONFIG
📋
CREATE TABLE products(title text, price float) morphology = 'stem_en, libstemmer_sv'

morphology_skip_fields

morphology_skip_fields = field1[, field2, ...]

Список полей, для которых пропускается морфологическая предобработка. Необязательно, по умолчанию пустой (применять препроцессоры ко всем полям).

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • CONFIG
📋
CREATE TABLE products(title text, name text, price float) morphology_skip_fields = 'name' morphology = 'stem_en'

min_stemming_len

min_stemming_len = length

Минимальная длина слова, с которой включается стемминг. Необязательно, по умолчанию 1 (стемминг для всех слов).

Стеммеры не идеальны, и иногда могут давать нежелательные результаты. Например, пропуск ключевого слова "gps" через Porter стеммер для английского приводит к "gp", что не соответствует намерению. Опция min_stemming_len позволяет подавить стемминг в зависимости от длины исходного слова, то есть избежать стемминга слишком коротких слов. Ключевые слова, короче указанного порога, не будут подвергаться стеммингу. Обратите внимание, что ключевые слова точно такой длины будут обработаны стеммерами. Таким образом, чтобы избежать стемминга трёхсимвольных ключевых слов, следует указать значение 4. Для более тонкой настройки обратитесь к функции wordforms.

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asycnio
  • javascript
  • Java
  • C#
  • Rust
  • CONFIG
📋
CREATE TABLE products(title text, price float) min_stemming_len = '4' morphology = 'stem_en'

index_exact_words

index_exact_words = {0|1}

Эта опция позволяет индексировать как оригинальные ключевые слова, так и их морфологически изменённые версии. Однако оригинальные ключевые слова, переназначенные через wordforms и exceptions, не могут быть проиндексированы. Значение по умолчанию — 0, что означает отключение этой функции.

Это даёт возможность использовать оператор точной формы в языке запросов. Включение этой функции увеличит размер полного текстового индекса и время индексации, но не повлияет на производительность поиска.

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • CONFIG
📋
CREATE TABLE products(title text, price float) index_exact_words = '1' morphology = 'stem_en'

jieba_hmm

jieba_hmm = {0|1}

Включить или отключить HMM в инструменте сегментации Jieba. Необязательно; значение по умолчанию — 1.

В Jieba опция HMM (скрытая марковская модель) относится к алгоритму, используемому для сегментации слов. В частности, она позволяет Jieba выполнять сегментацию китайских слов, распознавая неизвестные слова, особенно отсутствующие в его словаре.

Jieba в основном использует словарный метод для сегментации известных слов, но при включении опции HMM применяется статистическая модель для определения вероятных границ слов для слов или фраз, отсутствующих в словаре. Это особенно полезно для сегментации новых или редких слов, имён и сленга.

Вкратце, опция jieba_hmm помогает улучшить точность сегментации за счёт снижения производительности индексации. Её необходимо использовать вместе с morphology = jieba_chinese, см. Китайский, японский и корейский (CJK) и тайский языки.

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • CONFIG
📋
CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_hmm = '0'

jieba_mode

jieba_mode = {accurate|full|search}

Режим сегментации Jieba. Опционально; по умолчанию — accurate.

В режиме точности (accurate) Jieba разбивает предложение на максимально точные слова, используя сопоставление со словарём. Этот режим ориентирован на точность, обеспечивая наиболее аккуратное разбиение.

В полном режиме (full) Jieba пытается разбить предложение на все возможные словосочетания, стараясь включить все потенциальные слова. Этот режим акцентирует внимание на полноте, то есть выявляет как можно больше слов, даже если некоторые из них перекрываются или используются реже. Возвращаются все слова, найденные в словаре.

В режиме поиска (search) Jieba делит текст как на целые слова, так и на меньшие части, сочетая точное сегментирование с дополнительной детализацией за счет перекрывающихся фрагментов слов. Этот режим балансирует между точностью и полнотой, что полезно для поисковых систем.

jieba_mode должен использоваться вместе с morphology = jieba_chinese. См. Китайский, японский, корейский (CJK) и тайский языки.

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • CONFIG
📋
CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_mode = 'full'

jieba_user_dict_path

jieba_user_dict_path = path/to/stopwords/file

Путь к пользовательскому словарю Jieba. Опционально.

Jieba — библиотека сегментации китайского текста, использующая словарные файлы для помощи с разбиением слов. Формат этих словарных файлов следующий: каждая строка содержит слово, разделённое на три части пробелами — само слово, частоту слова и тег части речи (POS). Частота слова и тег части речи являются необязательными и могут быть опущены. Файл словаря должен быть в кодировке UTF-8.

Пример:

创新办 3 i
云计算 5
凱特琳 nz
台中

jieba_user_dict_path должен использоваться вместе с morphology = jieba_chinese. Подробнее см. Китайский, японский, корейский (CJK) и тайский языки.

‹›
  • SQL
  • JSON
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • CONFIG
📋
CREATE TABLE products(title text, price float) morphology = 'jieba_chinese' jieba_user_dict_path = '/usr/local/manticore/data/user-dict.txt'
Last modified: August 28, 2025