Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Microsoft menyediakan pemecah kata dan stemmer untuk sejumlah bahasa. Topik ini menjelaskan cara menerapkan dan menggunakan pemecah kata kustom dan stemmer untuk bahasa dan lokalitas di luar yang disediakan oleh Microsoft.
Nota
Pemecah kata kustom untuk sementara tidak didukung. Pada Juli 2018, perubahan dilakukan pada Windows Server 2019 yang mencegah DLL tanpa tanda tangan Microsoft dimuat oleh SearchIndexer.exe. Batasan ini dicabut pada Januari 2021.
Topik ini diatur sebagai berikut:
- Mendaftarkan DLL Sumber Daya Bahasa
- Mendaftarkan Bahasa
-
Menerapkan Word Beaker
- WordSink dan PhraseSink
- Jeda
- Skalabilitas, Performa, dan Keamanan
-
Menerapkan Proses Stemmer
- Skalabilitas, Performa, dan Keamanan
- Topik terkait
Mendaftarkan sebuah DLL sumber daya bahasa
Setiap DLL sumber daya bahasa harus menerapkan dan mengekspor titik masuk berikut. DLL dapat didaftarkan untuk berada di folder apa pun.
- DllMain adalah titik masuk standar ke DLL.
- DllRegisterServer mendaftarkan DLL di registri, seperti
regsvr32.exe %SystemRoot%\MyFolder\wordbreaker.dll - DllCanUnloadNow memungkinkan klien memanggil titik masuk ini melalui Model Objek Komponen (COM) untuk menentukan apakah mungkin untuk memuat DLL sumber daya bahasa.
- DllUnRegisterServer menghapus DLL dari registri.
Mendaftarkan bahasa
Registri berisi entri khusus bahasa untuk bahasa yang diindeks, dan entri ini mengontrol bagian dari proses pengindeksan dan kueri yang spesifik bahasa. Entri registri ini dapat ditemukan di bawah kunci registri berikut.
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
ContentIndex
Control
Language
Menerapkan fitur pemecah kata di Word
Pemecah kata menggunakan IWordBreaker. Metode IWordBreaker::BreakText melakukan semua pemrosesan dan penguraian teks. Untuk menerapkan komponen pemecah kata, Anda harus memiliki heuristik bahasa untuk bahasa Anda. Ini termasuk informasi tentang sintaksis dan morfologi. Anda mungkin juga memerlukan daftar kata untuk mengecualikan atau menyertakan. Anda membangun file kata-kata kebisingan untuk lokal bahasa Anda dari daftar kata-kata yang dikecualikan. Untuk informasi selengkapnya tentang pertimbangan linguistik dan bagaimana pertimbangan ini memengaruhi implementasi pemecah kata, lihat Pertimbangan Linguistik dan Unicode.
Tujuan utama IWordBreaker::BreakText adalah untuk memproses teks terus menerus dari TEXT_SOURCE sampai semua teks diproses, atau sampai pemecah kata mengalami kesalahan. Sementara dalam perulangan pemrosesan data ini, IWordBreaker::BreakText memanggil metode penguraian dan utilitas yang melakukan tugas tertentu untuk proses tersebut. Misalnya, pemecah kata Jerman dapat menangani kata majemuk, sedangkan pemecah kata Prancis dapat memproses diakritik atau klitik. Fungsi spesifik yang dilakukan pemecah kata dan strategi yang digunakannya dalam melakukan tugas-tugas ini sepenuhnya bergantung pada persyaratan untuk bahasa tersebut.
Saat memecah teks, pemisah kata mengidentifikasi bentuk "alternatif" untuk kata-kata yang mungkin memiliki beberapa representasi. Tidak ada hubungan semantik yang tersirat di antara kata-kata yang dihasilkan. Bahkan, kata asli mungkin tidak disertakan di antara daftar alternatif. Formulir alternatif disimpan dalam posisi yang sama dalam indeks sebagai kata asli untuk menunjukkan bahwa bentuk tersebut identik.
Saat dokumen disertakan dalam indeks, setiap kata diberi nilai bilangan bulat yang mewakili offset, atau jarak kata dari awal dokumen. Jarak relatif antara kata dalam kueri dibandingkan dengan offset yang disimpan dalam indeks teks lengkap. Kueri "Where is Kyle's document" cocok dengan dokumen apa pun dengan "Where" di offset n, "is" di n+1, "Kyle's" di n+2, dan "document" di n+3. Di mana dokumen Kyle disimpan dalam basis data?
| Di mana | adalah | Kyle Kyle's |
dokumen | diajukan | di | si | basis data database |
Dalam contoh ini, pemecah kata menyimpan bentuk alternatif untuk "Kyle" ("Kyle's") dan "database" ("basis data") dalam indeks. Pemecah kata menghasilkan dan menyimpan kata-kata alternatif selama proses pembuatan indeks dalam kondisi berikut:
- Jika kata alternatif kemungkinan muncul sebagai satu kata dalam kueri
- Jika stemmer kemungkinan besar tidak akan menghasilkan kata asli dari alternatif
Menghasilkan bentuk kata alternatif meningkatkan jumlah cara kueri mewakili dan mencocokkan kalimat, seperti yang ditunjukkan dalam variasi berikut:
- Di mana dokumen Kyle disimpan dalam basis data
- Di mana dokumen Kyle disimpan dalam database
- Di mana dokumen Kyle disimpan di basis data
- Di mana dokumen Kyle disimpan di database
WordSink dan PhraseSink
Pemecah kata menggunakan objek IWordSink dan objek IPhraseSink untuk mengumpulkan dan menyimpan semua kata dan frasa yang mereka ekstrak dari teks. Pemecah kata menyimpan kata dalam bentuk yang sedekat mungkin dengan bentuk asli dalam dokumen. IPhraseSink menyimpan frasa pada waktu kueri. Frasa meningkatkan relevansi hasil kueri karena urutan kata yang lebih panjang lebih langka dan memberikan perbedaan yang lebih besar daripada frasa yang lebih kecil. Ketika pengindeks menempatkan frasa di IPhraseSink pada waktu kueri, pengindeks membuat instans pemecah kata untuk memecah frasa menjadi kata-kata. Pengindeks kemudian mengevaluasi frasa dengan memeriksa apakah kata-kata dalam frasa terjadi berdekatan satu sama lain dalam indeks. Misalnya, jika "ABCD" terjadi dalam indeks pada posisi x, x+1, x+2, dan x+3, pencocokan frasa akan terjadi jika substring "ABCD" yang berdekatan dikirimkan dalam kueri. Strategi ini efektif untuk pemecah kata berbasis karakter yang memisahkan frasa dan kata-kata panjang selama pembuatan indeks dan yang menghasilkan frasa selama waktu kueri.
Istirahat
Jeda adalah spasi antar kata. Spasi kosong, tanda baca, pemformatan, atau hanya sifat bahasa itu sendiri yang dapat menyebabkan jeda. Ada empat jenis pemisah berbeda yang digunakan pengindeks: akhir kata (EOW), akhir kalimat (EOS), akhir paragraf (EOP) dan akhir bab (EOC). Pemisah EOW adalah jeda default. Setelah setiap token, setiap jeda menunjukkan jarak semantik yang berbeda antara kata-kata di kedua sisi. Kata-kata yang dipisahkan oleh EOW memiliki tautan semantik terketat, diikuti oleh EOS, EOP, dan EOC. Beberapa panggilan ke IWordSink::PutBreak bersifat kumulatif, dan menyerupai penyisipan kata atau kalimat kosong.
Skalabilitas, performa, dan keamanan
Cara kerja pemecah kata dalam merespons panggilan bersamaan sebagian besar ditentukan oleh pilihan model pemrosesan paralel Anda. Pengindeks adalah aplikasi yang berjalan dengan satu utas tunggal. Agar pemecah kata berfungsi di lingkungan satu utas, pemecah kata harus ditulis menggunakan model utas "bebas" atau "keduanya". Pemecah kata tidak boleh mendaftar dengan COM dengan menggunakan model utas "apartment".
Kami menyarankan agar pemecah kata menghindari status global dan menyimpan data dalam contoh pemecah kata. Satu-satunya konten yang harus disimpan dalam implementasi pemecah kata adalah untuk parameter fQuery dan ulMaxTokenSize. Pemecah kata tidak boleh lebih dari dua kali lebih lambat dari tolok ukur yang ditetapkan oleh pemecah kata bahasa Inggris. Kinerja pemecah kata juga seharusnya meningkat seiring dengan peningkatan kemampuan perangkat keras.
Pemecah kata untuk pengindeks berjalan dalam konteks keamanan Sistem Lokal. Mereka harus ditulis untuk mengelola buffer dan untuk menyusun dengan benar. Semua salinan string harus menggunakan pemeriksaan eksplisit untuk mencegah buffer overrun. Anda harus selalu memverifikasi ukuran buffer yang dialokasikan dan menguji ukuran data terhadap ukuran buffer. Pemecah kata tidak dapat mengasumsikan bahwa teks yang diteruskan ke metode IWordBreaker::BreakText terbentuk dengan baik. Untuk informasi selengkapnya tentang pemecahan masalah pemecah kata, lihat Pemecahan Masalah Sumber Daya Bahasa dan Praktik Terbaik.
Menerapkan stemmer
Stemmer mengimplementasikan antarmuka IStemmer. Metode IStemmer::GenerateWordForms menghasilkan daftar bentuk kata infleksi untuk kata input tertentu. Untuk menerapkan komponen stemmer, Anda harus memiliki heuristik bahasa untuk bahasa Anda. Ini termasuk informasi tentang morfologi. Anda mungkin juga memerlukan daftar kata untuk mengecualikan atau menyertakan. Untuk informasi selengkapnya tentang pertimbangan linguistik dan bagaimana pertimbangan ini memengaruhi implementasi stemmer, lihat Pertimbangan Linguistik dan Unicode.
Kami menyarankan agar stemmer tidak membentuk bentuk genitif atau posesif untuk kata-kata. Misalnya, "David" tidak dihasilkan sebagai bentuk alternatif untuk "David's". Pemisah kata menghasilkan "David" dan "David's" ketika mengurai "David's".
Stemmer menggunakan objek IWordFormSink untuk mengumpulkan daftar kata alternatif. IWordFormSink::PutWord menghasilkan kata akhir dari stemmer. Dalam semua kasus, kata terakhir ini sama dengan kata input dari IStemmer::GenerateWordForms. Misalnya, mengingat kata "berenang," stemmer menghasilkan bentuk kata berikut: "berenang," "perenang," "berenang," "berenang," dan "swum," melalui panggilan ke IWordFormSink::P utAltWord. Stemmer menghasilkan "berenang" melalui IWordFormSink::PutWord.
Skalabilitas, performa, dan keamanan
Stemmer, seperti pemecah kata, harus menggunakan model utas "bebas" dan mendaftar dengan COM dengan model utas mereka diatur ke "bebas" atau "keduanya." Windows Search memanggil instans terpisah dari stemmer pada utas yang berbeda secara bersamaan. Oleh karena itu, Stemmer harus memiliki data yang seminimal mungkin.
Akurasi stemmer memiliki dampak signifikan pada relevansi kueri. Jika stemmer menguraikan teks secara salah, kueri mungkin menghasilkan hasil yang tidak terduga dan tidak akurat. Stemmer harus menangani ratusan kueri per detik tanpa memengaruhi performa kueri secara negatif. Performa stemmer harus meningkat dengan peningkatan kemampuan perangkat keras. Untuk informasi mengenai cara mengatasi masalah stemmer, lihat Pemecahan Masalah Sumber Daya Bahasa dan Praktik Terbaik.
Stemmers untuk Windows Search berjalan pada konteks Keamanan Lokal. Mereka harus ditulis untuk mengelola buffer dan untuk menyusun dengan benar. Semua salinan string harus menggunakan pemeriksaan eksplisit untuk mencegah buffer overrun. Anda harus selalu memverifikasi ukuran buffer yang dialokasikan dan menguji ukuran data terhadap ukuran buffer.
Topik terkait