Fungsi MinHashCompatible with Milvus 3.0.x
Fungsi MinHash mengubah teks mentah menjadi vektor biner yang mendekati kemiripan Jaccard di antara dokumen. Fungsi ini menerapkan shingling teks dan beberapa fungsi hash untuk menghasilkan vektor tanda tangan dengan panjang tetap, sehingga memungkinkan deteksi near-duplikasi yang cepat dan deduplikasi dokumen dalam skala besar.
Sebagai fungsi bawaan, MinHash berjalan di dalam Milvus dan tidak memerlukan inferensi model eksternal atau prapemrosesan. Anda memasukkan teks mentah, dan Milvus menghasilkan vektor tanda tangan MinHash secara otomatis.
Batasan
Bidang keluaran harus berupa
BINARY_VECTORdengan dimensi yang memenuhidim % 32 == 0, karena setiap tanda tangan MinHash adalah nilai hash 32-bit.dimdari bidang vektor biner harus sama dengan32 * num_hashes. Ketidaksesuaian akan menyebabkan kesalahan.Ketika menggunakan indeks
MINHASH_LSHdengan keluaran fungsi MinHash,mh_element_bit_widthharus disetel ke32.
Bagaimana MinHash bekerja
MinHash adalah teknik hashing yang peka terhadap lokalitas yang memperkirakan kemiripan Jaccard antar set. Di Milvus, fungsi MinHash mengikuti alur berikut ini: Anda memberikan teks mentah sebagai masukan, dan Milvus menghasilkan vektor biner sebagai keluaran - menangani semua langkah perantara secara internal.
Alur kerja secara keseluruhan terdiri dari sebuah pipeline pemrosesan teks bersama yang digunakan oleh proses pemasukan dokumen dan pemrosesan kueri, diikuti oleh operasi fase spesifik untuk penyimpanan dan pengambilan.
Iaqkbfeh8oqggsx6nsocfosondo
Pipeline pemrosesan teks bersama
Baik pemasukan dokumen maupun pemrosesan kueri melewatkan teks mentah melalui transformasi empat tahap yang sama:
Analisis teks: Teks diproses oleh penganalisis (ketika
token_leveladalah"word") atau digunakan secara langsung (ketikatoken_leveladalah"char"). Tokenisasi tingkat kata menerapkan penganalisis yang dikonfigurasikan pada bidang input untuk menyegmentasikan teks menjadi istilah - misalnya,"milvus is vector db"menjadi["milvus", "is", "vector", "db"].Herpes zoster: Token dipecah menjadi n-gram yang tumpang tindih (herpes zoster) dengan ukuran
shingle_size. Sebagai contoh, dengan 3-gram pada tingkat kata, token["information", "retrieval", "is", "a", "field"]menjadi shingles seperti["information retrieval is", "retrieval is a", "is a field"].Pembuatan tanda tangan MinHash: Beberapa fungsi hash (H1, H2, ..., Hn, di mana n =
num_hashes) diterapkan pada kumpulan shingle. Untuk setiap fungsi hash, nilai hash minimum di seluruh sirap dipilih. Kumpulan nilai minimum ini membentuk tanda tangan MinHash - representasi dengan panjang tetap yang mendekati kemiripan Jaccard dari dokumen asli.Pengkodean vektor biner: Setiap nilai tanda tangan adalah hash 32-bit, dan tanda tangan lengkap dikemas ke dalam sebuah
BINARY_VECTORberdimensi32 * num_hashes.
Penyisipan dokumen
Selama penyisipan, vektor biner yang dihasilkan oleh pipeline bersama disimpan dalam indeks MINHASH_LSH. Indeks ini menyimpan tabel LSH (Locality-Sensitive Hashing) yang mengelompokkan tanda tangan yang serupa ke dalam bucket yang sama, sehingga memungkinkan pengambilan kandidat dengan cepat pada waktu kueri.
Pemrosesan kueri
Selama pencarian, teks kueri melewati pipeline bersama yang sama untuk menghasilkan vektor biner. Vektor ini digunakan untuk melakukan pencarian LSH di indeks MINHASH_LSH, yang dengan cepat mengidentifikasi pasangan kandidat yang kemungkinan besar mirip. Kandidat kemudian diurutkan berdasarkan estimasi kemiripan Jaccard dan hasil K teratas dikembalikan.
Karena kedua jalur memiliki logika transformasi yang sama, dua dokumen dengan konten yang sangat tumpang tindih menghasilkan tanda tangan MinHash yang serupa. Hal ini membuat fungsi ini efektif untuk menemukan duplikat yang hampir sama bahkan ketika dokumen berbeda dalam urutan kata, format, atau frasa kecil.
Sebelum Anda mulai
Sebelum menggunakan fungsi MinHash, rencanakan skema koleksi Anda untuk menyertakan yang berikut ini:
Bidang teks untuk konten mentah
Koleksi Anda harus menyertakan bidang
VARCHARuntuk menyimpan teks mentah. Bidang ini berfungsi sebagai masukan untuk fungsi MinHash.Penganalisis untuk bidang teks (saat menggunakan tokenisasi tingkat kata)
Jika
token_leveldisetel ke"word"(default), bidang teks harus memiliki penganalisis yang diaktifkan. Penganalisis mendefinisikan bagaimana teks diberi token sebelum di-shing. Secara default, Milvus menggunakan penganalisisstandard. Untuk mengonfigurasi penganalisis yang berbeda, lihat Memilih Penganalisis yang Tepat untuk Kasus Penggunaan Anda.Bidang vektor biner untuk keluaran MinHash
Koleksi Anda harus menyertakan bidang
BINARY_VECTORuntuk menyimpan vektor biner yang dihasilkan oleh fungsi MinHash. Dimensinya harus sama dengan32 * num_hashes.
Langkah 1: Membuat koleksi dengan fungsi MinHash
Untuk menggunakan fungsi MinHash, tentukan fungsi tersebut saat membuat koleksi. Fungsi ini menjadi bagian dari skema koleksi dan diterapkan secara otomatis selama penyisipan dan pencarian data.
Menentukan bidang skema
Skema koleksi Anda harus menyertakan setidaknya tiga bidang:
Bidang utama: Mengidentifikasi secara unik setiap entitas dalam koleksi.
Bidang teks (
VARCHAR): Menyimpan dokumen teks mentah. Tetapkanenable_analyzer=Trueagar Milvus dapat memproses teks untuk pembuatan tanda tangan MinHash. Secara default, Milvus menggunakan penganalisisstandarduntuk analisis teks. Untuk mengonfigurasi penganalisis yang berbeda, lihat Memilih Penganalisis yang Tepat untuk Kasus Penggunaan Anda.Bidang vektor biner (
BINARY_VECTOR): Menyimpan vektor biner yang dihasilkan secara otomatis oleh fungsi MinHash. Dimensinya harus sama dengan32 * num_hashes.
from pymilvus import MilvusClient, DataType, Function, FunctionType
client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
schema = client.create_schema()
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(field_name="document_content", datatype=DataType.VARCHAR, max_length=9000, enable_analyzer=True)
schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=8192)
// java
// nodejs
// go
# restful
Mendefinisikan fungsi MinHash
Fungsi MinHash mengubah teks yang dianalisis menjadi vektor biner yang mendekati kemiripan Jaccard antar dokumen.
Tentukan fungsi dan tambahkan ke skema Anda:
minhash_function = Function(
name="minhash_function",
input_field_names=["document_content"], # Name of the VARCHAR field containing raw text
output_field_names=["binary_vector"], # Name of the BINARY_VECTOR field for generated signatures
function_type=FunctionType.MINHASH,
params={
"num_hashes": 256, # Number of hash functions; produces dim = 32 * 256 = 8192
"shingle_size": 3, # N-gram size for shingling
}
)
schema.add_function(minhash_function)
// java
// nodejs
// go
# restful
Opsi konfigurasi
Kamus params dari fungsi MinHash menerima parameter-parameter berikut ini. Semua nama parameter tidak peka huruf besar/kecil.
Parameter |
Tipe |
Default |
Deskripsi |
|---|---|---|---|
|
int |
Berasal dari |
Jumlah fungsi hash untuk pembuatan tanda tangan. Dimensi vektor biner keluaran sama dengan |
|
int |
|
Ukuran N-gram untuk shingling. Tingkat kata: 1-3 adalah tipikal. Tingkat karakter: 2-6 adalah tipikal. |
|
str |
|
Fungsi hash untuk digunakan. Pilihan:
|
|
str |
|
Tingkat tokenisasi. Pilihan:
|
|
int |
|
Benih acak untuk inisialisasi fungsi MinHash. |
Mengkonfigurasi indeks
Jenis indeks yang direkomendasikan untuk vektor biner MinHash adalah MINHASH_LSH, dengan tipe metrik MHJACCARD.
index_params = client.prepare_index_params()
index_params.add_index(
field_name="binary_vector",
index_type="MINHASH_LSH",
metric_type="MHJACCARD",
params={
"mh_lsh_band": 128,
"mh_element_bit_width": 32,
"with_raw_data": True,
},
)
// java
// nodejs
// go
# restful
Buat koleksi
Buat koleksi menggunakan skema dan parameter indeks yang telah ditentukan di atas:
client.create_collection(
collection_name="dedup_collection",
schema=schema,
index_params=index_params,
)
// java
// nodejs
// go
# restful
Langkah 2: Memasukkan dokumen
Setelah menyiapkan koleksi Anda, masukkan data teks. Anda hanya perlu menyediakan teks mentah - fungsi MinHash secara otomatis menghasilkan vektor biner untuk setiap dokumen.
client.insert(
"dedup_collection",
[
{"document_content": "information retrieval is a field of study that helps users find relevant information in large datasets"},
{"document_content": "information retrieval is a research field focused on helping users find relevant data in large collections"},
{"document_content": "information retrieval is a field of research helping users search for relevant information in large datasets"},
],
)
// java
// nodejs
// go
# restful
Langkah 3: Cari dengan MinHash
Setelah Anda memasukkan data, cari dokumen yang hampir sama dengan memberikan kueri teks mentah. Milvus secara otomatis mengubah teks kueri Anda menjadi vektor biner MinHash dan mengambil dokumen yang paling mirip menggunakan estimasi kemiripan Jaccard.
search_params = {
"metric_type": "MHJACCARD",
"params": {},
}
results = client.search(
collection_name="dedup_collection",
data=["information retrieval is a research field focused on helping users find relevant data in large collections"],
anns_field="binary_vector",
limit=3,
output_fields=["document_content"],
search_params=search_params,
)
for hits in results:
for hit in hits:
print(f"ID: {hit['id']}, Distance: {hit['distance']}")
print(f"Document: {hit['entity']['document_content']}")
// java
// nodejs
// go
# restful
Selanjutnya
Pencarian Teks Lengkap: Gunakan BM25 untuk peringkat relevansi leksikal, bukan deteksi nyaris duplikat.
Gambaran Umum Penganalisis: Mengonfigurasi penganalisis khusus untuk tokenisasi teks.
Indeks MINHASH_LSH: Pelajari tentang menyetel parameter LSH untuk penarikan dan kinerja.