Pencarian fuzzy untuk memperbaiki kesalahan ejaan dan kesalahan ketik

Azure AI Search mendukung pencarian fuzzy, jenis kueri yang mengkompensasi kesalahan ketik dan istilah yang salah eja dalam string input. Pemindaian pencarian fuzzy untuk istilah yang memiliki komposisi yang sama. Memperluas pencarian untuk menutupi hampir kecocokan memiliki efek koreksi otomatis kesalahan ketik ketika perbedaan hanyalah beberapa karakter yang salah tempat.

Ini adalah latihan ekspansi kueri yang menghasilkan kecocokan dengan istilah yang memiliki komposisi yang sama. Ketika pencarian fuzzy ditentukan, mesin pencari membangun grafik (berdasarkan teori automaton terbatas deterministik) dari istilah yang disusun serupa, untuk semua istilah dalam kueri. Misalnya, jika kueri Anda menyertakan tiga istilah "university of washington", grafik dibuat untuk setiap istilah dalam kueri search=university~ of~ washington~ (tidak ada penghapusan kata berhenti dalam pencarian fuzzy, jadi "of" mendapatkan grafik).

Grafik terdiri dari hingga 50 ekspansi, atau permutasi, dari setiap istilah, menangkap varian yang benar dan salah dalam prosesnya. Mesin kemudian mengembalikan kecocokan paling relevan dalam respons.

Untuk istilah seperti "universitas", grafik mungkin memiliki "unversty, universty, university, universe, inverse". Dokumen apa pun yang cocok dengan dokumen yang ada di grafik disertakan dalam hasil. Berbeda dengan kueri lain yang menganalisis teks untuk menangani berbagai bentuk kata yang sama ("mice" dan "mouse"), perbandingan dalam kueri fuzzy diambil pada nilai nominal tanpa analisis linguistik pada teks. "Universe" dan "inverse", yang secara semantik berbeda, akan cocok karena perbedaan sintaksisnya kecil.

Kecocokan berhasil jika perbedaan dibatasi pada dua atau lebih sedikit pengeditan, di mana pengeditan adalah karakter yang disisipkan, dihapus, diganti, atau diubah urutannya. Algoritma koreksi string yang menentukan diferensial adalah metrik jarak Damerau-Levenshtein. Ini digambarkan sebagai "jumlah minimum operasi (penyisipan, penghapusan, substitusi, atau transposisi dua karakter yang berdekatan) yang diperlukan untuk mengubah satu kata ke kata lainnya".

Di Pencarian Azure AI:

  • Kueri fuzzy berlaku untuk seluruh istilah. Frasa tidak didukung secara langsung tetapi Anda dapat menentukan kecocokan fuzzy pada setiap istilah frasa multi-bagian melalui konstruksi AND. Contohnya,search=dr~ AND cleanin~. Ekspresi kueri ini menemukan kecocokan pada "dry cleaning".

  • Jarak default pengeditan adalah 2. Nilai ~0 tidak menandakan ekspansi (hanya istilah yang tepat yang dianggap cocok), tetapi Anda dapat menentukan ~1 untuk satu tingkat perbedaan, atau satu pengeditan.

  • Kueri fuzzy dapat memperluas istilah hingga 50 permutasi. Batas ini tidak dapat dikonfigurasi, tetapi Anda dapat secara efektif mengurangi jumlah ekspansi dengan mengurangi jarak edit menjadi 1.

  • Tanggapan terdiri dari dokumen yang berisi kecocokan yang relevan (hingga 50).

Selama pemrosesan kueri, kueri fuzzy tidak menjalani analisis leksikal. Masukan kueri ditambahkan langsung ke pohon kueri dan diperluas untuk membuat grafik istilah. Satu-satunya transformasi yang dilakukan adalah selubung yang lebih rendah.

Secara kolektif, grafik diajukan sebagai kriteria pertandingan terhadap token dalam indeks. Seperti yang dapat Anda bayangkan, pencarian fuzzy secara inheren lebih lambat daripada formulir kueri lainnya. Ukuran dan kompleksitas indeks Anda dapat menentukan apakah manfaatnya cukup untuk mengimbangi latensi respons.

Catatan

Karena pencarian fuzzy cenderung lambat, mungkin ada baiknya untuk menyelidiki alternatif seperti pengindeksan n-gram, dengan perkembangan urutan karakter pendek (urutan dua dan tiga karakter untuk token bigram dan trigram). Bergantung pada bahasa komputer dan permukaan kueri Anda, n-gram mungkin memberi Anda performa yang lebih baik. Keuntungannya adalah pengindeksan n-gram sangat intensif penyimpanan dan menghasilkan indeks yang jauh lebih besar.

Alternatif lain, yang dapat Anda pertimbangkan jika Anda ingin menangani hanya kasus yang paling mengerikan, akan menjadi peta sinonim. Misalnya, memetakan "search" ke "serach, serch, sarch", atau "retrieve" ke "retreive".

Bidang string yang dikaitkan sebagai "dapat dicari" adalah kandidat untuk pencarian fuzzy.

Penganalisis tidak digunakan untuk membuat grafik ekspansi, tetapi itu tidak berarti penganalisis harus diabaikan dalam skenario pencarian fuzzy. Penganalisis penting untuk tokenisasi selama pengindeksan, di mana token dalam indeks terbalik digunakan untuk pencocokan terhadap grafik.

Seperti biasa, jika kueri pengujian tidak menghasilkan kecocokan yang Anda harapkan, bereksperimenlah dengan penganalisis pengindeksan yang berbeda. Misalnya, coba penganalisis bahasa untuk melihat apakah Anda mendapatkan hasil yang lebih baik. Beberapa bahasa komputer, terutama yang memiliki mutasi vokal, dapat mengambil manfaat dari bentuk kata infleksi dan tidak teratur yang dihasilkan oleh prosesor bahasa alami Microsoft. Dalam beberapa kasus, menggunakan penganalisis bahasa pemrogram yang tepat dapat membuat perbedaan apakah istilah ditokenisasi dengan cara yang kompatibel dengan nilai yang disediakan oleh pengguna.

Kueri fuzzy dibangun menggunakan sintaks kueri Lucene lengkap, memanggil pengurai kueri Lucene lengkap, dan menambahkan karakter ~ tilde setelah setiap istilah yang dimasukkan oleh pengguna.

Berikut adalah contoh permintaan kueri yang memanggil pencarian fuzzy. Ini termasuk empat istilah, dua di antaranya salah eja:

POST https://[service name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2023-11-01
{
    "search": "seatle~ waterfront~ view~ hotle~",
    "queryType": "full",
    "searchMode": "any",
    "searchFields": "HotelName, Description",
    "select": "HotelName, Description, Address/City,",
    "count": "true"
}
  1. Atur jenis kueri ke sintaks Lucene lengkap (queryType=full).

  2. Berikan string kueri di mana setiap istilah diikuti oleh operator tilde (~) di akhir setiap istilah keseluruhan (search=<string>~). Grafik ekspansi dibuat untuk setiap istilah dalam input kueri.

    Sertakan parameter opsional, angka antara 0 dan 2 (default), jika Anda ingin menentukan jarak edit (~1). Misalnya, "blue~" atau "blue~1" akan mengembalikan "blue", "blues", dan "glue".

Secara opsional, Anda dapat meningkatkan performa kueri dengan mencakup permintaan ke bidang tertentu. searchFields Gunakan parameter untuk menentukan bidang mana yang akan dicari. Anda juga bisa menggunakan select properti untuk menentukan bidang mana yang dikembalikan dalam respons kueri.

Untuk pengujian sederhana, sebaiknya Cari penjelajah atau klien REST untuk iterasi melalui ekspresi kueri. Kedua alat ini interaktif, yang berarti Anda dapat dengan cepat melangkah melalui beberapa varian istilah dan mengevaluasi respons yang kembali.

Ketika hasilnya ambigu, penyorotan klik dapat membantu Anda mengidentifikasi kecocokan dalam respons.

Catatan

Penggunaan penyorotan hit untuk mengidentifikasi kecocokan fuzzy memiliki keterbatasan dan hanya berfungsi untuk pencarian fuzzy dasar. Jika indeks Anda memiliki profil penilaian, atau jika Anda melapisi kueri dengan lebih banyak sintaks, penyorotan klik mungkin gagal mengidentifikasi kecocokan.

Contoh 1: pencarian kabur dengan istilah yang tepat

Misalkan untai (karakter) berikut ini ada dalam bidang "Description" dalam dokumen pencarian: "Test queries with special characters, plus strings for MSFT, SQL and Java."

Mulai dengan pencarian fuzzy pada "khusus" dan tambahkan penyorotan klik ke bidang Deskripsi:

search=special~&highlight=Description

Dalam respons, karena Anda menambahkan penyorotan klik, pemformatan diterapkan ke "khusus" sebagai istilah yang cocok.

"@search.highlights": {
    "Description": [
        "Test queries with <em>special</em> characters, plus strings for MSFT, SQL and Java."
    ]
}

Coba permintaan lagi, salah eja "khusus" dengan mengambil beberapa huruf ("pe"):

search=scial~&highlight=Description

Sejauh ini, tidak ada perubahan pada respons. Mengingat default jarak 2 derajat, menghapus dua karakter "pe" dari "khusus" masih memungkinkan kecocokan yang berhasil pada istilah tersebut.

"@search.highlights": {
    "Description": [
        "Test queries with <em>special</em> characters, plus strings for MSFT, SQL and Java."
    ]
}

Mencoba satu permintaan lagi, ubah istilah pencarian lebih lanjut dengan mengeluarkan satu karakter terakhir untuk total tiga penghapusan (dari "khusus" menjadi "scal"):

search=scal~&highlight=Description

Perhatikan bahwa respons yang sama dikembalikan, tetapi sekarang alih-alih cocok pada "special", pertandingan fuzzy ada di "SQL".

"@search.score": 0.4232868,
"@search.highlights": {
    "Description": [
        "Mix of special characters, plus strings for MSFT, <em>SQL</em>, 2019, Linux, Java."
    ]
}

Inti dari contoh yang diperluas ini adalah untuk menggambarkan kejelasan yang mengenai penyorotan dapat membawa ke hasil yang ambigu. Dalam semua kasus, dokumen yang sama dikembalikan. Seandainya Anda mengandalkan DOKUMEN untuk memverifikasi kecocokan, Anda mungkin telah melewatkan perubahan dari "special" ke "SQL".

Lihat juga