Saya mencari untuk memecahkan masalah berikut: Saya memiliki satu set kalimat sebagai dataset saya, dan saya ingin dapat mengetikkan kalimat baru, dan menemukan kalimat yang paling mirip dengan yang ada di dataset. Contohnya akan terlihat seperti:
Kalimat baru: " I opened a new mailbox
"
Prediksi berdasarkan dataset:
Sentence | Similarity
A dog ate poop 0%
A mailbox is good 50%
A mailbox was opened by me 80%
Saya telah membaca bahwa cosine similarity dapat digunakan untuk menyelesaikan masalah-masalah seperti ini yang dipasangkan dengan tf-idf (dan RNNs seharusnya tidak membawa perbaikan signifikan pada metode dasar), atau juga word2vec digunakan untuk masalah yang serupa. Apakah itu benar-benar layak untuk digunakan dalam kasus khusus ini juga? Apakah ada teknik / algoritma lain untuk menyelesaikan ini (sebaiknya dengan Python dan SKLearn, tapi saya juga terbuka untuk belajar tentang TensorFlow)?
sumber
Jawaban:
Masalah Anda dapat diselesaikan dengan Word2vec serta Doc2vec. Doc2vec akan memberikan hasil yang lebih baik karena memperhitungkan kalimat saat melatih model.
Solusi Doc2vec
Anda dapat melatih model doc2vec Anda dengan mengikuti tautan ini . Anda mungkin ingin melakukan beberapa langkah pra-pemrosesan seperti menghapus semua kata berhenti (kata-kata seperti "the", "an", dll. Yang tidak menambah banyak arti pada kalimat). Setelah Anda melatih model Anda, Anda dapat menemukan kalimat yang sama menggunakan kode berikut.
Hasil:
Hasil di atas adalah daftar tuple untuk
(label,cosine_similarity_score)
. Anda dapat memetakan output ke kalimat dengan melakukantrain[29670]
.Harap dicatat bahwa pendekatan di atas hanya akan memberikan hasil yang baik jika model doc2vec Anda berisi embeddings untuk kata-kata yang ditemukan dalam kalimat baru. Jika Anda mencoba untuk mendapatkan kesamaan untuk beberapa kalimat omong kosong seperti
sdsf sdf f sdf sdfsdffg
, itu akan memberi Anda beberapa hasil, tetapi itu mungkin bukan kalimat serupa yang sebenarnya karena model terlatih Anda mungkin belum melihat kata-kata omong kosong ini saat melatih model. Jadi cobalah latih model Anda pada kalimat sebanyak mungkin untuk memasukkan sebanyak mungkin kata untuk hasil yang lebih baik.Solusi Word2vec
Jika Anda menggunakan word2vec, Anda perlu menghitung vektor rata-rata untuk semua kata dalam setiap kalimat dan menggunakan persamaan cosinus antara vektor.
Hitung Kesamaan
sumber
sentence_1.split()
melakukan hal yang sama.Word Mover's Distance (WMD) adalah algoritma untuk menemukan jarak antar kalimat. WMD didasarkan pada embeddings kata (misalnya, word2vec) yang menyandikan makna semantik kata menjadi vektor padat.
Sebagai contoh:
Sumber: "Dari Embeddings Kata Ke Jarak Dokumen"
The paket gensim memiliki implementasi WMD .
Untuk masalah Anda, Anda akan membandingkan kalimat yang dimasukkan dengan semua kalimat lain dan mengembalikan kalimat yang memiliki WMD terendah.
sumber
Anda dapat mencoba solusi mudah menggunakan sklearn dan itu akan berfungsi dengan baik.
Gunakan tfidfvectorizer untuk mendapatkan representasi vektor dari setiap teks
Fit vectorizer dengan data Anda, menghapus stop-kata.
Ubah entri baru dengan vektorizer yang sebelumnya dilatih
Hitung persamaan cosinus antara representasi ini dan setiap representasi elemen dalam set data Anda.
Jika Anda memiliki hugh dataset, Anda dapat mengelompokkannya (misalnya menggunakan KMeans dari scikit belajar) setelah mendapatkan representasi, dan sebelum memprediksi data baru.
Kode ini melakukan semua langkah ini. Anda dapat memeriksanya di repo github saya .
sumber
Ada beberapa karya terbaru berdasarkan Variational Auto-Encoder dalam model RNN. Menghasilkan Kalimat dari Ruang Berkelanjutan , dengan implementasi pytorch: kode github .
mereka berhasil memampatkan fitur global semantik, sintaksis dari sebuah kalimat ke dalam ruang laten yang diekspresikan mungkin dengan beberapa variabel acak independen hingga 10 hingga 30 (distribusi faktor).
ide baru dalam karya ini, mereka interpolasi antara dua kalimat. dan hasilnya sangat menakjubkan.
sumber
Solusi umum terdiri dari langkah-langkah berikut -
Untuk 1. word2vec adalah pilihan terbaik tetapi jika Anda tidak ingin menggunakan word2vec, Anda dapat membuat beberapa perkiraan untuk itu. Salah satu caranya adalah membuat matriks kata-kata yang muncul bersamaan dari kalimat-kalimat terlatih Anda diikuti dengan menerapkan TSVD di atasnya. Matriks coccurance darin Xn dimensi ketika dikonversi menjadi n Xd dimensi, membuat untuk kata vektor d ukuran.
Setelah Anda menyematkan kata setiap kata, Anda dapat menerapkan salah satu dari metrik kesamaan seperti kesamaan cosinus, dll. Pada setiap kalimat untuk mengukur kesamaan dengan yang lain.
sumber