Bagaimana pembelajaran mesin dimasukkan ke dalam desain mesin pencari?

15

Saat ini saya sedang membangun mesin pencari in-house kecil berdasarkan Apache Lucene. Tujuannya sederhana - berdasarkan beberapa kata kunci, ini akan menyarankan beberapa artikel yang ditulis secara internal di dalam perusahaan kami. Saya menggunakan skor TF-IDF yang cukup standar sebagai metrik dasar dan membangun mekanisme penilaian saya sendiri di atasnya. Semua ini tampaknya berfungsi sangat baik kecuali untuk beberapa kasus sudut di mana peringkat tampaknya kacau.

Jadi apa yang saya rencanakan untuk dilakukan adalah menambahkan tautan Relevan / Tidak Relevan kecil ke halaman hasil pencarian sehingga pengguna dapat mengklik salah satu dari mereka tergantung pada persepsi mereka tentang apakah hasil itu harus dimasukkan di tempat pertama.

Ide saya

  1. Perlakukan ini Relevan / Tidak Relevan sebagai label dan buat data pelatihan.
  2. Gunakan data ini untuk melatih classifier (seperti SVM)
  3. Masukkan model ini ke mesin pencari, yaitu, setiap hasil baru akan melewati pengklasifikasi dan akan diberi label apakah itu relevan atau tidak.

Pendekatan ini tampaknya intuitif bagi saya tetapi saya tidak yakin apakah itu akan berhasil dalam praktiknya. Saya punya dua pertanyaan spesifik:

  1. Apa semua fitur yang harus saya ekstrak?
  2. Apakah ada cara yang lebih baik untuk mengintegrasikan komponen pembelajaran mesin ke mesin pencari? Tujuan akhir saya adalah "mempelajari" fungsi peringkat berdasarkan logika bisnis dan umpan balik pengguna.
Legenda
sumber
4
Saya melakukan sesuatu seperti ini sekali dan para pengguna membencinya sehingga saya mematikannya. Masalahnya adalah perilaku pengguna. Pengguna beradaptasi dengan kelemahan dalam hasil pencarian dengan mengubah istilah mereka, dan kemudian mereka akan terus menggunakan kembali istilah tersebut. Sistem merespons menyesuaikan peringkat item dan persyaratan yang disukai mulai menghasilkan hasil yang berbeda. Ini membatalkan pengguna. Belajar tidak berarti itu lebih pintar;)
Reactgular
Berikut adalah implementasi menggunakan elasticsearch dan angularjs - juga berisi penjelasan Anda perlu - machinelearningblogs.com/2016/12/12/...
Vivek Kalyanarangan

Jawaban:

15

(1) Apa saja fitur yang harus saya ekstrak?

Pertama, sadari bahwa Anda tidak mengklasifikasikan dokumen. Anda mengklasifikasikan pasangan (dokumen, kueri), jadi Anda harus mengekstrak fitur yang menyatakan seberapa cocok mereka.

Pendekatan standar dalam belajar menentukan peringkat adalah menjalankan kueri terhadap berbagai pengaturan mesin pencari (mis. Tf-idf, BM-25, dll.) Dan kemudian melatih model pada skor kesamaan, tetapi untuk SE kecil, khusus domain, Anda dapat memiliki fitur seperti

  • Untuk setiap istilah, boolean yang menunjukkan apakah istilah tersebut muncul di kueri dan dokumen. Atau mungkin bukan boolean, tetapi bobot tf-idf dari istilah kueri yang benar-benar terjadi dalam dokumen.
  • Berbagai metrik yang tumpang tindih seperti Jaccard atau Tanimoto.

(2) Apakah ada cara yang lebih baik untuk mengintegrasikan komponen pembelajaran mesin ke mesin pencari? Tujuan akhir saya adalah "mempelajari" fungsi peringkat berdasarkan logika bisnis dan umpan balik pengguna.

Ini adalah pertanyaan yang sangat luas, dan jawabannya tergantung pada seberapa banyak upaya yang ingin Anda lakukan. Peningkatan pertama yang muncul di benak Anda adalah bahwa Anda tidak boleh menggunakan penilaian relevansi biner dari pengklasifikasi, tetapi fungsi keputusannya yang bernilai nyata, sehingga Anda benar-benar dapat melakukan pemeringkatan bukan hanya penyaringan. Untuk SVM, fungsi keputusan adalah jarak masuk ke hyperplane. Paket pembelajaran mesin yang baik memiliki antarmuka untuk mendapatkan nilai itu.

Di luar itu, lihatlah pembelajaran berpasangan dan searah dengan daftar peringkat; apa yang Anda sarankan adalah apa yang disebut pendekatan pointwise. IIRC, berpasangan bekerja jauh lebih baik dalam latihan. Alasannya adalah bahwa dengan peringkat berpasangan, Anda perlu lebih sedikit klik: daripada membuat pengguna label dokumen sebagai relevan / tidak relevan, Anda hanya memberi mereka tombol "relevan". Kemudian Anda mempelajari classifier biner pada tiga kali lipat (document1, document2, query) yang memberi tahu apakah document1 lebih relevan dengan query daripada document2, atau sebaliknya. Ketika seorang pengguna memberi label, ucapkan, dokumentasikan 4 pada peringkat sebagai relevan, yang memberi Anda enam sampel untuk dipelajari:

  • document4> document3
  • document4> document2
  • document4> document1
  • document1 <document4
  • document2 <document4
  • document3 <document4

sehingga Anda mendapatkan negatif secara gratis.

(Ini semua hanya saran, saya belum mencoba semua ini. Kebetulan saya pernah bekerja di sebuah kelompok penelitian di mana orang-orang menyelidiki pembelajaran peringkat. Saya pernah melakukan presentasi makalah orang lain untuk kelompok membaca sekali, mungkin slide dapat membantu.)

Fred Foo
sumber
+1 Terima kasih. Ini adalah kedua kalinya kamu membantuku! Biarkan saya mengambil beberapa jam untuk mencerna ini. :)
Legenda
4
Itu jawaban yang sangat bagus, saya hanya ingin menyarankan sedikit perubahan. Dari perspektif ux, Anda jauh lebih mungkin membuat pengguna menilai suatu hasil dengan menggunakan tombol "tidak relevan" daripada tombol "relevan". Siapa yang bertahan untuk mencetak hasil ketika mereka menemukan apa yang mereka cari? Mereka jauh lebih mungkin untuk menekan tombol yang terlihat seperti sebuah "kesempatan untuk mengeluh" ketika mereka tidak menemukan apa yang mereka inginkan, karena memperbaiki sistem pada saat itu sebenarnya selaras dengan tujuan mereka saat ini.
Racheet
4
tl; dr Jika Anda hanya akan menggunakan satu input, jadikan itu "tidak relevan", orang lebih cenderung mengkliknya ketika mereka frustrasi.
Racheet
Apa yang akan menjadi pendekatan "listwise"? Juga, apakah maksud Anda 3 atau 6 contoh gratis? (3 yang terakhir tampaknya hanya merupakan pengulangan dari 3 yang pertama?)
maks