Bagikan melalui


Menerapkan Word Breaker dan Stemmer

Microsoft menyediakan pemecah kata dan stemmer untuk sejumlah bahasa. Topik ini menjelaskan cara menerapkan, dan menggunakan pemecah kata kustom dan stemmer untuk bahasa, dan lokal di luar yang disediakan oleh Microsoft.

Catatan

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

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 untuk memanggil titik masuk ini melalui Model Objek Komponen (COM) untuk menentukan apakah mungkin untuk membongkar DLL sumber daya bahasa.
  • DllUnRegisterServer menghapus DLL dari registri.

Mendaftarkan Bahasa

Registri berisi entri khusus bahasa untuk bahasa yang sedang 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 Word Beaker

Word breaker mengimplementasikan IWordBreaker. Metode IWordBreaker::BreakText melakukan semua pemrosesan dan penguraian teks. Untuk mengimplementasikan 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 klitoris. Fungsi spesifik yang dilakukan pemecah kata dan strategi yang digunakannya dalam melakukan tugas-tugas ini sepenuhnya bergantung pada persyaratan untuk bahasa tersebut.

Saat memecahkan teks, pemecah kata mengidentifikasi formulir "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. Bentuk 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" at offset n, "is" at n+1, "Kyle's" at n+2, dan "document" at n+3. "Di mana dokumen Kyle diajukan di basis data?" direpresentasikan sebagai:

               
Di mana is Kyle Kyle's
dokumen Filed under dalam Sebuah 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 cenderung muncul sebagai satu kata dalam kueri
  • Jika stemmer tidak mungkin memperoleh kata asli dari alternatif

Menghasilkan bentuk kata alternatif meningkatkan jumlah cara kueri mewakili dan mencocokkan kalimat, seperti yang ditunjukkan dalam variasi berikut:

  1. Di mana dokumen Kyle diajukan dalam database
  2. Di mana dokumen Kyle diajukan dalam database
  3. Di mana dokumen Kyle diajukan di pangkalan data
  4. Di mana dokumen Kyle diajukan di pangkalan data

WordSink dan PhraseSink

Word breaker menggunakan objek IWordSink dan IPhraseSink untuk mengumpulkan dan menyimpan semua kata dan frasa yang mereka ekstrak dari teks. Pemecah kata menyimpan kata-kata dalam formulir yang sedekat mungkin dengan bentuk kata 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. Saat 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

Pemisah adalah spasi di antara kata-kata. Spasi kosong, tanda baca, pemformatan, atau hanya sifat bahasa itu sendiri yang dapat menyebabkan jeda. Ada empat jenis jeda berbeda yang digunakan pengindeks: akhir kata (EOW), akhir kalimat (EOS), akhir paragraf (EOP) dan akhir bab (EOC). Jeda 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::P utBreak bersifat kumulatif, dan dianalogikan dengan menyisipkan kata atau kalimat null.

Skalabilitas, Performa, dan Keamanan

Cara pemecah kata merespons panggilan simultan sebagian besar ditentukan oleh pilihan model utas Anda. Pengindeks adalah aplikasi utas tunggal. Agar pemecah kata berfungsi di lingkungan utas tunggal, pemecah kata harus ditulis menggunakan model utas "gratis" atau "keduanya". Word breaker tidak boleh mendaftar dengan COM dengan menggunakan model utas "apartemen".

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. Word breaker tidak boleh lebih dari dua kali lebih lambat dari tolok ukur yang ditetapkan oleh pemecah kata bahasa Inggris. Word performa pemutus juga harus meningkat dengan peningkatan kemampuan perangkat keras.

Word breaker untuk pengindeks yang dijalankan dalam konteks keamanan Sistem Lokal. Mereka harus ditulis untuk mengelola buffer dan untuk menumpuk dengan benar. Semua salinan string harus memiliki pemeriksaan eksplisit untuk melindungi dari overrun buffer. Anda harus selalu memverifikasi ukuran buffer yang dialokasikan dan menguji ukuran data terhadap ukuran buffer. Word breaker tidak dapat mengasumsikan bahwa teks yang diteruskan ke metode IWordBreaker::BreakText terbentuk dengan baik. Untuk informasi selengkapnya tentang pemecahan masalah pemecahan masalah pemecahan masalah, lihat Pemecahan Masalah Sumber Daya Bahasa dan Praktik Terbaik.

Menerapkan Stemmer

Stemmer mengimplementasikan antarmuka IStemmer . Metode IStemmer::GenerateWordForms menghasilkan daftar bentuk kata yang tidak terbentuk 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 boleh menghasilkan kata-kata yang genitif, atau posesif. Misalnya, "David" tidak dihasilkan sebagai bentuk alternatif untuk "David". Pemecah kata menghasilkan "David" dan "David" ketika mengurai "David's."

Stemmer menggunakan objek IWordFormSink untuk mengumpulkan daftar kata alternatif. IWordFormSink::P utWord menghasilkan kata akhir dari stemmer. Dalam semua kasus, kata akhir 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::P utWord.

Skalabilitas, Performabilitas, dan Keamanan

Stemmer, seperti pemecah kata, harus menggunakan model utas "gratis" dan mendaftar dengan COM dengan model utas mereka diatur ke "gratis" atau "keduanya." Windows Search memanggil instans terpisah stemmer dari utas yang berbeda secara bersamaan. Oleh karena itu stemmer harus memiliki data instans minimal.

Akurasi stemmer memiliki dampak signifikan pada relevansi kueri. Jika stemmer salah membendung teks, kueri dapat mengembalikan hasil yang tidak dapat diprediksi 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 tentang pemecahan masalah stemmer, lihat Pemecahan Masalah Sumber Daya Bahasa dan Praktik Terbaik.

Stemmer untuk Windows Search berjalan dalam konteks Keamanan Lokal. Mereka harus ditulis untuk mengelola buffer dan untuk menumpuk dengan benar. Semua salinan string harus memiliki pemeriksaan eksplisit untuk melindungi dari overrun buffer. Anda harus selalu memverifikasi ukuran buffer yang dialokasikan dan menguji ukuran data terhadap ukuran buffer.

Memperluas Sumber Daya Bahasa

Memahami Komponen Sumber Daya Bahasa

Pertimbangan Linguistik dan Unicode

Pemecahan Masalah Sumber Daya Bahasa dan Praktik Terbaik