Расширенная морфология

Морфологические препроцессоры могут применяться к словам во время индексирования для нормализации различных форм одного слова и улучшения сегментации. Например, английский стеммер может нормализовать "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 - применить украинский лемматизатор и выбрать одну корневую форму
  • lemmatize_en - применить английский лемматизатор и выбрать одну корневую форму
  • lemmatize_de - применить немецкий лемматизатор и выбрать одну корневую форму
  • lemmatize_ru_all - применить русский лемматизатор и индексировать все возможные корневые формы
  • lemmatize_uk_all - применить украинский лемматизатор и индексировать все возможные корневые формы
  • 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" через стеммер Портера для английского языка даёт "gp", что не совсем соответствует цели. Функция min_stemming_len позволяет отключать стемминг в зависимости от длины исходного слова, т.е. избегать стемминга слишком коротких слов. Ключевые слова, которые короче заданного порога, стеммингу подвергаться не будут. Обратите внимание, что ключевые слова, длина которых в точности равна указанной, будут проходить стемминг. Таким образом, чтобы избежать стемминга для 3-символьных ключевых слов, следует указать значение 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 (Hidden Markov Model, скрытая марковская модель) относится к алгоритму, используемому для сегментации слов. В частности, она позволяет 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 пытается разбить предложение на все возможные комбинации слов, стремясь включить все потенциальные слова. Этот режим ориентирован на максимизацию полноты охвата (recall), то есть он идентифицирует как можно больше слов, даже если некоторые из них перекрываются или используются реже. Он возвращает все слова, найденные в его словаре.

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

jieba_mode должен использоваться с morphology = jieba_chinese. Смотрите Языки с непрерывными сценариями (Chinese, Japanese, Korean (CJK) и Thai).

‹›
  • 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 tag). Частотность слова и POS tag опциональны и могут быть опущены. Файл словаря должен быть в кодировке UTF-8.

Пример:

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

jieba_user_dict_path должен использоваться с morphology = jieba_chinese. Для более подробной информации см. Языки с непрерывными сценариями (Chinese, Japanese, Korean (CJK) и Thai).

‹›
  • 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: April 30, 2026