Doc2vec (gensim) - Bagaimana saya bisa menyimpulkan label kalimat yang tidak terlihat?

14

https://radimrehurek.com/gensim/models/doc2vec.html

Misalnya, jika kita telah melatih doc2vec dengan

"aaaaaAAAAAaaaaaa" - "label 1"

"BbbbbbBBBBBbbbb" - "label 2"

dapatkah kita menyimpulkan "aaaaAAAAaaaaAA" ​​adalah label 1 menggunakan Doc2vec?

Saya tahu Doc2vec dapat melatih vektor kata dan label label. Dengan menggunakan vektor ini, dapatkah kita menyimpulkan kalimat yang tidak terlihat (kombinasi kata-kata terlatih) di label mana?

Seongho
sumber

Jawaban:

11

Judul pertanyaan ini adalah pertanyaan yang terpisah untuk teksnya sehingga saya akan menjawab keduanya secara terpisah (mengingat bahwa yang satu mengarah ke yang lain).

  1. Bagaimana saya bisa menyimpulkan kalimat yang tidak terlihat:
# ... trained model stored in var model
list_of_words = ["this", "is", "a", "new","unseen", "sentence"]
inferred_embedding = model.infer_vector(list_of_words)

Bagaimana cara kerjanya? Sesuai dengan makalah aslinya ( https://cs.stanford.edu/~quocle/paragraph_vector.pdf ) kami memiliki dua matriks bobot yang diinisialisasi secara acak yang sama matriks dari Word2Vec di mana setiap kolom atau baris memetakan ke vektor kata dan yang merupakan matriks dokumen di mana setiap kolom atau baris memetakan ke kalimat / dokumen. Selama pelatihan, sebuah softmax classifier bergerak ukuran window tetap (dalam jendela bergerak seperti mode) meminimalkan kemungkinan log berikut (multi-class cross-entropy): D R M × R kWRN×PDRM.×Rk

1M.saya=1M.1|Dsaya|t=k|Dsaya-1|-klHaig(hal(wtsaya|wt-ksaya,...,wt+ksaya,Dsaya))

Di mana sesuai dengan vektor yang mewakili kalimat ,jumlah kata dalam dokumen itu dan adalah kata dalam dokumen . Semua ingat kembali-propagasi adalah dokumen yang saat ini kami pindahkan softmax windowed kami dan hanya pembaruan yang baris dalam matriks bersama dengan kata-kata di jendela itu.Dsayasayath|Dsaya|wtsayatthsayathD

Terlebih lagi ketika kita ingin menyimpulkan sesuatu yang tidak ada dalam set pelatihan, kita memperbaiki sehingga tidak diperbarui dan menambah matriks dengan baris yang baru diinisialisasi secara acak dan hanya melatih untuk beberapa iterasi (dengan baris baru memegang embedding untuk vektor yang disimpulkan) . Ini mengarah ke pertanyaan 2.WD

  1. Bisakah kita menyimpulkan bahwa kalimat yang mungkin tidak terlihat persis sama dengan kalimat dalam set pelatihan?

Jawaban singkatnya adalah tidak dan ini bukan untuk apa Doc2Vec. Karena inisialisasi acak + kompleksitas konvergensi dan pelatihan vektor tereka Anda tidak akan pernah sama persis dengan vektor yang bersesuaian dalam inilah mengapa Gensim belum membangun fungsi untuk mendukung ini, bagaimana pun mengingat bahwa modelnya telah baik terlatih kedua vektor ini harus dekat secara sewenang-wenang sehingga Anda dapat menyimpulkan bahwa keduanya sangat mirip.D

Meskipun memperbaiki benih acak mungkin tidak berfungsi, ada begitu banyak variabel lain yang dapat memengaruhi konvergensinya, silakan lihat jawaban pertama di https://github.com/RaRe-Technologies/gensim/issues/374 .

Dalam kasus apa pun, Anda dapat menemukan label paling mirip dalam kumpulan data Anda ke kalimat yang disimpulkan hanya dengan mengulangi set pelatihan Anda dan membandingkan kesamaan dengan vektor yang disimpulkan. Tetapi mengapa Anda ingin melakukan pertandingan yang tepat dengan sesuatu di set pelatihan? itulah ekspresi reguler untuk tujuan penyematan dokumen ini untuk tugas belajar yang diawasi atau tidak diawasi (yaitu klasifikasi dan pengelompokan).

Francisco Vargas
sumber
0

Saya mencoba menyelesaikan masalah ini hari ini, dan tidak dapat menemukan modul apa pun yang diberikan oleh gensim.Doc2Vec yang menghitung kesamaan antara vektor dokumen yang disimpulkan tidak dalam model yang terlatih dengan yang ada dalam model yang terlatih. Jadi pada dasarnya saya melakukan ini.

from scipy import spatial
inferred_vector=model.infer_vector(sentence.split())
for labels in labelled_documents:
    print (1-  spatial.distance.cosine(inferred_vector,model.docvecs[labels]))
Himanshu Rai
sumber
0

Berdasarkan tutorial Gensim Doc2Vec , Anda dapat melakukan sesuatu seperti ini.

inferred_vector = model_dmm.infer_vector(sentence.split())
sims = model.docvecs.most_similar([inferred_vector], topn=len(model.docvecs))

Ini akan memberi Anda daftar tupel dengan semua label dan probabilitas yang terkait dengan dokumen baru Anda milik masing-masing label. maka Anda cukup mengambil nilai terbesar sebagai label Anda.

Amirhos Imani
sumber