Фильтр токенов MinHash
Использует технику MinHash, чтобы создать подпись для потока токенов. Вы можете использовать подписи MinHash для оценки сходства документов. Смотрите Использование фильтра токенов min_hash для поиска по сходству.
Фильтр min_hash выполняет следующие операции над потоком токенов в указанном порядке:
- Вычисляет хэш каждого токена в потоке.
- Присваивает хэши корзинам, сохраняя только самые маленькие хэши каждой корзины.
- Выводит самый маленький хэш из каждой корзины как поток токенов.
Этот фильтр использует MinHashFilter из Lucene.
Настраиваемые параметры
-
bucket_count - (Необязательно, целое число) Количество корзин, которым присваиваются хэши. По умолчанию
512. -
hash_count - (Необязательно, целое число) Количество способов вычисления хэша для каждого токена в потоке. По умолчанию
1. -
hash_set_size -
(Необязательно, целое число) Количество хэшей, которые нужно сохранить из каждой корзины. По умолчанию
1.Хэши сохраняются по возрастанию, начиная с наименьшего хэша в корзине.
-
with_rotation - (Необязательно, логическое значение) Если
true, фильтр заполняет пустые корзины значением из первой непустой корзины справа по кругу, если аргументhash_set_sizeравен1. Если аргументbucket_countбольше1, этот параметр по умолчанию равенtrue. В противном случае, этот параметр по умолчанию равенfalse.
Рекомендации по настройке фильтра min_hash
- Входные токены фильтра
min_hashобычно должны быть n-граммами токенов, сгенерированными фильтром n-грамм. Вы должны выбрать значениеkдостаточно большим, чтобы вероятность появления любой конкретной n-граммы в документе была низкой. В то же время, поскольку внутренне каждая n-грамма хешируется в 128-битный хэш, вы должны выбрать значениеkдостаточно малым, чтобы все возможные уникальные n-граммы могли быть хешированы в 128-битный хэш с минимальным коллизией. - Мы рекомендуем вам протестировать различные значения аргументов для параметров
hash_count,bucket_countиhash_set_size:- Для повышения точности увеличивайте аргументы
bucket_countилиhash_set_size. Более высокие значенияbucket_countиhash_set_sizeувеличивают вероятность того, что разные токены будут индексированы в разные корзины. - Для повышения полноты увеличивайте значение аргумента
hash_count. Например, установкаhash_countв2хеширует каждый токен двумя различными способами, увеличивая количество потенциальных кандидатов для поиска.
- Для повышения точности увеличивайте аргументы
- По умолчанию фильтр
min_hashгенерирует 512 токенов для каждого документа. Размер каждого токена составляет 16 байт. Это означает, что размер каждого документа будет увеличен примерно на 8 Кб. - Фильтр
min_hashиспользуется для вычисления косинусного сходства. Это означает, что неважно, сколько раз документ содержит определенный токен, важно только то, содержит ли он его или нет.
Использование фильтра токенов min_hash для поиска по сходству
Фильтр токенов min_hash позволяет хешировать документы для поиска по сходству. Поиск по сходству, или поиск ближайших соседей, — сложная задача. Простое решение требует исчерпывающего сравнения каждой пары документов (запрос и документ из индекса). Это неприемлемо, если индекс большой. Разработаны различные решения для приближенного поиска ближайших соседей, которые делают поиск по сходству более практичным и выполнимым с точки зрения вычислений. Одно из этих решений включает хеширование документов.
Документы хешируются таким образом, что похожие документы с большей вероятностью генерируют одинаковый хэш и попадают в одну корзину, в то время как несхожие документы с большей вероятностью хешируются в разные корзины. Такой тип хеширования называется чувствительным к локальности хешированием (LSH).
В зависимости от определения сходства между документами, были предложены различные функции LSH . Для сходства Жаккара популярной функцией LSH является MinHash. Общий принцип того, как MinHash создает подпись для документа, заключается в применении случайной перестановки над всем словарём индекса (случайное нумерование для словаря) и записи минимального значения для этой перестановки для документа (минимальное число для слова словаря, присутствующего в документе). Перестановки выполняются несколько раз; объединение минимальных значений для всех них составит подпись для документа.
На практике вместо случайных перестановок выбирается несколько функций хеширования. Функция хеширования вычисляет хэш-код для каждого токена документа и выбирает минимальный хэш-код среди них. Минимальные хэш-коды от всех функций хеширования объединяются для формирования подписи документа.
Настройка и добавление в анализатор
Чтобы настроить фильтр min_hash, дублируйте его, чтобы создать основу для нового пользовательского фильтра токенов. Вы можете изменить фильтр, используя его настраиваемые параметры.
Например, следующий запрос создания индекса API использует следующие пользовательские фильтры токенов для настройки нового пользовательского анализатора:
-
my_shingle_filter, пользовательскийshingleфильтр.my_shingle_filterвыводит только n-граммы из пяти слов. -
my_minhash_filter, пользовательский фильтрmin_hash.my_minhash_filterхеширует каждую пятисловную n-грамму один раз. Затем он распределяет хэши по 512 корзинам, сохраняя только наименьший хэш из каждой корзины.
Запрос также назначает пользовательский анализатор для отображения поля fingerprint.
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"filter": {
"my_shingle_filter": {
"type": "shingle",
"min_shingle_size": 5,
"max_shingle_size": 5,
"output_unigrams": False
},
"my_minhash_filter": {
"type": "min_hash",
"hash_count": 1,
"bucket_count": 512,
"hash_set_size": 1,
"with_rotation": True
}
},
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [
"my_shingle_filter",
"my_minhash_filter"
]
}
}
}
},
mappings={
"properties": {
"fingerprint": {
"type": "text",
"analyzer": "my_analyzer"
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
filter: {
my_shingle_filter: {
type: 'shingle',
min_shingle_size: 5,
max_shingle_size: 5,
output_unigrams: false
},
my_minhash_filter: {
type: 'min_hash',
hash_count: 1,
bucket_count: 512,
hash_set_size: 1,
with_rotation: true
}
},
analyzer: {
my_analyzer: {
tokenizer: 'standard',
filter: [
'my_shingle_filter',
'my_minhash_filter'
]
}
}
}
},
mappings: {
properties: {
fingerprint: {
type: 'text',
analyzer: 'my_analyzer'
}
}
}
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
filter: {
my_shingle_filter: {
type: "shingle",
min_shingle_size: 5,
max_shingle_size: 5,
output_unigrams: false,
},
my_minhash_filter: {
type: "min_hash",
hash_count: 1,
bucket_count: 512,
hash_set_size: 1,
with_rotation: true,
},
},
analyzer: {
my_analyzer: {
tokenizer: "standard",
filter: ["my_shingle_filter", "my_minhash_filter"],
},
},
},
},
mappings: {
properties: {
fingerprint: {
type: "text",
analyzer: "my_analyzer",
},
},
},
});
console.log(response); PUT /my-index-000001
{
"settings": {
"analysis": {
"filter": {
"my_shingle_filter": {
"type": "shingle",
"min_shingle_size": 5,
"max_shingle_size": 5,
"output_unigrams": false
},
"my_minhash_filter": {
"type": "min_hash",
"hash_count": 1,
"bucket_count": 512,
"hash_set_size": 1,
"with_rotation": true
}
},
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [
"my_shingle_filter",
"my_minhash_filter"
]
}
}
}
},
"mappings": {
"properties": {
"fingerprint": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
} | Настраивает пользовательский фильтр n-грамм, чтобы выводить только пятисловные n-граммы. | |
| Каждая пятисловные n-грамма в потоке хешируется один раз. | |
| Хэши распределяются по 512 корзинам. | |
| Сохраняется только наименьший хэш в каждой корзине. | |
| Фильтр заполняет пустые корзины значениями соседних корзин. |
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/analysis-minhash-tokenfilter.html