Синоним

Фильтр synonym переписывает лексемы в соответствии со словарем синонимов, чтобы при поиске совпадали родственные термины. Он поддерживает два режима работы и два способа предоставления словаря:

  • Режимы работы - режим expand сохраняет исходную лексему и выдает дополнительные синонимы к ней; режим нормализации (expand: false) переписывает лексемы в каноническую форму.

  • Источники словарей - небольшие словари могут быть встроены в конфигурацию фильтра через массив synonyms; большие словари должны храниться как файловый ресурс и ссылаться на него через synonyms_file.

Формат словаря

Словарь синонимов - это текстовый документ (или инлайн-массив), в котором каждая строка определяет одно правило. Поддерживаются две формы правил.

Правило сопоставления

fast, quick => speedy

Токены слева (fast, quick) переписываются в токены справа (speedy). Допускается несколько целей:

small, little => tiny, compact

При использовании expand: true исходные лексемы сохраняются рядом с целевыми:

  • Введите fast с expand: truefast, speedy

  • Ввод fast с expand: falsespeedy

Группа эквивалентности

happy, joyful, cheerful

Все перечисленные лексемы считаются эквивалентными:

  • С expand: true, любое вхождение любой лексемы в группу испускает все лексемы в группе. Вход happyhappy, joyful, cheerful.

  • С помощью expand: false каждое вхождение переписывается на первую лексему в группе. Вход joyfulhappy; вход happy уже является первой лексемой и не изменяется.

Конфигурация

Фильтр synonym является пользовательским фильтром. Укажите "type": "synonym" вместе с хотя бы одним из synonyms (inline) или synonyms_file (external), плюс флаг expand.

analyzer_params = {
    "tokenizer": "standard",
    "filter": [
        {
            "type": "synonym",
            "synonyms": [                       # inline rules (optional)
                "fast, quick => speedy",
                "happy, joyful, cheerful",
            ],
            "synonyms_file": {                  # external rules (optional)
                "type": "remote",
                "resource_name": "en_synonyms",
                "file_name": "synonyms.txt",
            },
            "expand": True,
        }
    ],
}

Фильтр synonym принимает следующие параметры.

Параметр

Описание

По умолчанию

synonyms

Массив строк правил. Каждая строка использует формат словаря, описанный выше. Подходит для небольших словарей (до нескольких десятков правил).

-

synonyms_file

Ссылка на файловый ресурс, хранящий правила синонимов, по одному в строке. Используется для больших словарей. См. раздел Внешний файл словаря ниже.

-

expand

Булевский флаг, управляющий применением правил. true сохраняет исходную лексему и выводит синонимы вместе с ней; false переписывает лексемы в их каноническую форму (правая часть отображения или первая лексема группы эквивалентности).

false

Вы можете указать synonyms, synonyms_file или оба варианта. Если присутствуют оба, фильтр объединяет два источника. Фильтр работает с лексемами, созданными токенизатором; поэтому его необходимо использовать вместе с токенизатором, например, стандартным токенизатором.

Внешний файл словаря

Для словарей производственного размера зарегистрируйте файл как удаленный файловый ресурс и ссылайтесь на него с сайта synonyms_file.

from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530")

# Register the file once, then reference it from any analyzer that needs it.
client.add_file_resource(
    name="en_synonyms",
    path="file/synonyms.txt",     # full S3 object key, including rootPath
)

analyzer_params = {
    "tokenizer": "standard",
    "filter": [{
        "type": "synonym",
        "synonyms_file": {
            "type": "remote",
            "resource_name": "en_synonyms",
            "file_name": "synonyms.txt",
        },
        "expand": True,
    }],
}

Полный порядок действий (загрузка, регистрация, список, удаление) и альтернативную форму "type": "local" см. в разделе Управление файловыми ресурсами.

Примеры

Прежде чем применять анализатор к схеме коллекции, проверьте его поведение с помощью run_analyzer. В следующих примерах для краткости используется встроенный массив synonyms; для больших словарей замените его на synonyms_file.

expand: true - сохранить оригинал, добавить синонимы

from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530")

analyzer_params = {
    "tokenizer": "standard",
    "filter": [{
        "type": "synonym",
        "synonyms": [
            "fast, quick => speedy",
            "happy, joyful, cheerful",
        ],
        "expand": True,
    }],
}

print(client.run_analyzer(["a fast car"], analyzer_params))
# → [['a', 'fast', 'speedy', 'car']]

print(client.run_analyzer(["i am happy today"], analyzer_params))
# → [['i', 'am', 'happy', 'joyful', 'cheerful', 'today']]

Оба словаря fast и happy сохраняются; их синонимы выдаются вместе с ними.

expand: false - Переписать в каноническую форму

analyzer_params_norm = {
    "tokenizer": "standard",
    "filter": [{
        "type": "synonym",
        "synonyms": [
            "fast, quick => speedy",
            "happy, joyful, cheerful",
        ],
        "expand": False,
    }],
}

print(client.run_analyzer(["a fast car"], analyzer_params_norm))
# → [['a', 'speedy', 'car']]

print(client.run_analyzer(["i am happy today"], analyzer_params_norm))
# → [['i', 'am', 'happy', 'today']]

Правило отображения переписывает fast в speedy. Группа эквивалентности оставляет happy без изменений, поскольку это первая лексема группы; входные данные, содержащие joyful или cheerful, были бы переписаны в happy.

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?