Синоним
Фильтр synonym переписывает лексемы в соответствии со словарем синонимов, чтобы при поиске совпадали родственные термины. Он поддерживает два режима работы и два способа предоставления словаря:
Режимы работы - режим
expandсохраняет исходную лексему и выдает дополнительные синонимы к ней; режим нормализации (expand: false) переписывает лексемы в каноническую форму.Источники словарей - небольшие словари могут быть встроены в конфигурацию фильтра через массив
synonyms; большие словари должны храниться как файловый ресурс и ссылаться на него черезsynonyms_file.
Формат словаря
Словарь синонимов - это текстовый документ (или инлайн-массив), в котором каждая строка определяет одно правило. Поддерживаются две формы правил.
Правило сопоставления
fast, quick => speedy
Токены слева (fast, quick) переписываются в токены справа (speedy). Допускается несколько целей:
small, little => tiny, compact
При использовании expand: true исходные лексемы сохраняются рядом с целевыми:
Введите
fastсexpand: true→fast,speedyВвод
fastсexpand: false→speedy
Группа эквивалентности
happy, joyful, cheerful
Все перечисленные лексемы считаются эквивалентными:
С
expand: true, любое вхождение любой лексемы в группу испускает все лексемы в группе. Входhappy→happy,joyful,cheerful.С помощью
expand: falseкаждое вхождение переписывается на первую лексему в группе. Входjoyful→happy; вход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 принимает следующие параметры.
Параметр |
Описание |
По умолчанию |
|---|---|---|
|
Массив строк правил. Каждая строка использует формат словаря, описанный выше. Подходит для небольших словарей (до нескольких десятков правил). |
- |
|
Ссылка на файловый ресурс, хранящий правила синонимов, по одному в строке. Используется для больших словарей. См. раздел Внешний файл словаря ниже. |
- |
|
Булевский флаг, управляющий применением правил. 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.