Menurut Gensim Word2Vec , saya dapat menggunakan model word2vec dalam paket gensim untuk menghitung kesamaan antara 2 kata.
misalnya
trained_model.similarity('woman', 'man')
0.73723527
Namun, model word2vec gagal memprediksi kemiripan kalimat. Saya menemukan model LSI dengan kemiripan kalimat dalam gensim, tetapi, tampaknya tidak dapat digabungkan dengan model word2vec. Panjang korpus setiap kalimat yang saya miliki tidak terlalu panjang (lebih pendek dari 10 kata). Jadi, adakah cara sederhana untuk mencapai tujuan tersebut?
Jawaban:
Ini sebenarnya adalah masalah yang cukup menantang yang Anda tanyakan. Menghitung kesamaan kalimat membutuhkan membangun model gramatikal kalimat, memahami struktur yang setara (misalnya "dia berjalan ke toko kemarin" dan "kemarin, dia berjalan ke toko"), menemukan kesamaan tidak hanya dalam kata ganti dan kata kerja tetapi juga dalam kata benda yang tepat, menemukan kejadian / hubungan statistik dalam banyak contoh tekstual nyata, dll.
Hal paling sederhana yang dapat Anda coba - meskipun saya tidak tahu seberapa baik kinerjanya dan pasti tidak akan memberikan hasil yang optimal - adalah dengan terlebih dahulu menghapus semua kata "stop" (kata seperti "the", "sebuah ", dll. yang tidak memberi banyak arti pada kalimat) lalu jalankan word2vec pada kata-kata di kedua kalimat, jumlahkan vektor di satu kalimat, jumlahkan vektor di kalimat lain, lalu temukan perbedaan antara jumlahnya. Dengan menjumlahkannya alih-alih melakukan perbedaan bijak, Anda setidaknya tidak akan tunduk pada urutan kata. Meskipun demikian, ini akan gagal dalam banyak hal dan bukan merupakan solusi yang baik dengan cara apa pun (meskipun solusi yang baik untuk masalah ini hampir selalu melibatkan sejumlah NLP, pembelajaran mesin, dan kepintaran lainnya).
Jadi, jawaban singkatnya adalah, tidak, tidak ada cara mudah untuk melakukan ini (setidaknya tidak melakukannya dengan baik).
sumber
Karena Anda menggunakan gensim, Anda mungkin harus menggunakan implementasi doc2vec itu. doc2vec adalah perpanjangan dari word2vec ke tingkat frase-, kalimat-, dan dokumen. Ini ekstensi yang cukup sederhana, dijelaskan di sini
http://cs.stanford.edu/~quocle/paragraph_vector.pdf
Gensim bagus karena intuitif, cepat, dan fleksibel. Yang hebat adalah Anda dapat mengambil embeddings kata yang telah dilatih sebelumnya dari halaman resmi word2vec dan lapisan syn0 model Doc2Vec gensim terbuka sehingga Anda dapat menyemai kata embeddings dengan vektor berkualitas tinggi ini!
GoogleNews-vektor-negative300.bin.gz (seperti yang ditautkan di Google Code )
Saya pikir gensim jelas merupakan alat termudah (dan sejauh ini bagi saya, yang terbaik) untuk menyematkan kalimat dalam ruang vektor.
Terdapat teknik kalimat-ke-vektor selain yang diusulkan dalam makalah Le & Mikolov di atas. Socher dan Manning dari Stanford jelas merupakan dua peneliti paling terkenal yang bekerja di bidang ini. Karya mereka didasarkan pada prinsip komposisi - semantik kalimat berasal dari:
Mereka telah mengusulkan beberapa model seperti itu (menjadi semakin kompleks) untuk bagaimana menggunakan komposisionalitas untuk membangun representasi tingkat kalimat.
2011 - autoencoder rekursif terbuka (sangat relatif sederhana. Mulai di sini jika tertarik)
2012 - jaringan saraf matriks-vektor
2013 - jaringan tensor saraf
2015 - Pohon LSTM
makalahnya semua tersedia di socher.org. Beberapa model ini tersedia, tetapi saya tetap merekomendasikan doc2vec gensim. Pertama, URAE 2011 tidak terlalu kuat. Selain itu, ia dilengkapi dengan bobot yang sesuai untuk parafrase data news-y. Kode yang dia berikan tidak memungkinkan Anda melatih ulang jaringan. Anda juga tidak dapat menukar vektor kata yang berbeda, jadi Anda terjebak dengan embeddings pra-word2vec 2011 dari Turian. Vektor-vektor ini tentu saja tidak berada pada level word2vec atau GloVe.
Belum bekerja dengan Tree LSTM, tapi sepertinya sangat menjanjikan!
tl; dr Ya, gunakan doc2vec gensim. Tetapi metode lain memang ada!
sumber
Jika Anda menggunakan word2vec, Anda perlu menghitung vektor rata-rata untuk semua kata di setiap kalimat / dokumen dan menggunakan kesamaan kosinus antar vektor:
Hitung kesamaan:
sumber
Anda dapat menggunakan algoritma Jarak Penggerak Kata. berikut adalah penjelasan mudah tentang WMD .
NB: jika Anda menghadapi kesalahan tentang impor pustaka pyemd , Anda dapat menginstalnya menggunakan perintah berikut:
sumber
Setelah Anda menghitung jumlah dari dua kumpulan vektor kata, Anda harus mengambil kosinus di antara vektor, bukan selisihnya. Kosinus dapat dihitung dengan mengambil produk titik dari dua vektor yang dinormalisasi. Jadi, jumlah kata bukanlah faktor.
sumber
Ada fungsi dari dokumentasi yang mengambil daftar kata dan membandingkan kesamaannya.
sumber
Saya ingin memperbarui solusi yang ada untuk membantu orang-orang yang akan menghitung kesamaan semantik kalimat.
Langkah 1:
Muat model yang sesuai menggunakan gensim dan hitung vektor kata untuk kata dalam kalimat dan simpan sebagai daftar kata
Langkah 2: Menghitung vektor kalimat
Perhitungan kemiripan semantik antara kalimat sulit sebelumnya tetapi baru-baru ini sebuah makalah bernama " A SIMPLE BUT TOUGH-TO-BEAT BASELINE FOR SENTENCE EMBEDDINGS " diusulkan yang menyarankan pendekatan sederhana dengan menghitung rata-rata tertimbang vektor kata dalam kalimat dan kemudian menghapus proyeksi vektor rata-rata pada komponen utama pertamanya. Di sini bobot kata w adalah a / (a + p (w)) dengan a menjadi parameter dan p (w) frekuensi kata (perkiraan) disebut frekuensi invers halus .metode ini berkinerja jauh lebih baik.
Kode sederhana untuk menghitung vektor kalimat menggunakan SIF (smooth inverse frequency) metode yang diusulkan di makalah telah diberikan di sini
Langkah 3: menggunakan sklearn cosine_similarity memuat dua vektor untuk kalimat dan menghitung kesamaan.
Ini adalah metode paling sederhana dan efisien untuk menghitung kesamaan kalimat.
sumber
Saya menggunakan metode berikut dan berfungsi dengan baik. Pertama-tama Anda perlu menjalankan POSTagger dan kemudian memfilter kalimat Anda untuk menghilangkan kata-kata penghenti (determinan, konjungsi, ...). Saya merekomendasikan TextBlob APTagger . Kemudian Anda membangun word2vec dengan mengambil mean dari setiap vektor kata dalam kalimat. The Metode n_similarity di Gemsim word2vec tidak tepat dengan memungkinkan untuk lulus dua set kata-kata untuk membandingkan.
sumber
Ada ekstensi Word2Vec yang dimaksudkan untuk memecahkan masalah membandingkan bagian teks yang lebih panjang seperti frasa atau kalimat. Salah satunya adalah paragraph2vec atau doc2vec.
"Representasi Terdistribusi dari Kalimat dan Dokumen" http://cs.stanford.edu/~quocle/paragraph_vector.pdf
http://rare-technologies.com/doc2vec-tutorial/
sumber
Gensim mengimplementasikan model yang disebut Doc2Vec untuk penyematan paragraf .
Ada berbagai tutorial yang disajikan sebagai notebook IPython:
Metode lain akan bergantung pada Word2Vec dan Word Mover's Distance (WMD) , seperti yang ditunjukkan dalam tutorial ini:
Solusi alternatif akan mengandalkan vektor rata-rata:
Terakhir, jika Anda dapat menjalankan Tensorflow, Anda dapat mencoba: https://tfhub.dev/google/universal-sentence-encoder/2
sumber
Saya telah mencoba metode yang diberikan oleh jawaban sebelumnya. Ini berfungsi, tetapi kelemahan utamanya adalah semakin panjang kalimatnya semakin besar kesamaannya (untuk menghitung kesamaan saya menggunakan skor cosinus dari dua embeddings rata-rata dari dua kalimat apa pun) karena semakin banyak kata semakin banyak efek semantik positif akan ditambahkan ke kalimat.
Saya pikir saya harus berubah pikiran dan menggunakan kalimat embedding seperti yang dipelajari dalam makalah ini dan ini .
sumber
Grup Riset Facebook merilis solusi baru yang disebut Hasil InferSent dan kode diterbitkan di Github, periksa repo mereka. Ini sangat mengagumkan. Saya berencana untuk menggunakannya. https://github.com/facebookresearch/InferSent
makalah mereka https://arxiv.org/abs/1705.02364 Abstrak: Banyak sistem NLP modern yang mengandalkan embeddings kata, yang sebelumnya dilatih dengan cara tanpa pengawasan pada korpora besar, sebagai fitur dasar. Upaya untuk mendapatkan embeddings untuk potongan teks yang lebih besar, seperti kalimat, tidak begitu berhasil. Beberapa upaya untuk mempelajari representasi kalimat tanpa pengawasan belum mencapai kinerja yang cukup memuaskan untuk diadopsi secara luas. Dalam makalah ini, kami menunjukkan bagaimana representasi kalimat universal yang dilatih menggunakan data yang diawasi dari set data Inferensi Bahasa Alami Stanford dapat secara konsisten mengungguli metode tanpa pengawasan seperti vektor SkipThought pada berbagai tugas transfer. Mirip seperti bagaimana computer vision menggunakan ImageNet untuk mendapatkan fitur, yang kemudian dapat ditransfer ke tugas lain, pekerjaan kami cenderung menunjukkan kesesuaian inferensi bahasa alami untuk pembelajaran transfer ke tugas NLP lainnya. Pembuat enkode kami tersedia untuk umum.
sumber
Jika tidak menggunakan Word2Vec, kami memiliki model lain untuk menemukannya menggunakan BERT untuk penyematan. Di bawah ini adalah tautan referensi https://github.com/UKPLab/sentence-transformers
Tautan lain untuk mengikuti https://github.com/hanxiao/bert-as-service
sumber