Apa cara terbaik untuk mengetahui kemiripan semantik kata-kata? Word2Vec baik-baik saja, tetapi tidak ideal:
# Using the 840B word Common Crawl GloVe vectors with gensim:
# 'hot' is closer to 'cold' than 'warm'
In [7]: model.similarity('hot', 'cold')
Out[7]: 0.59720456121072973
In [8]: model.similarity('hot', 'warm')
Out[8]: 0.56784095376659627
# Cold is much closer to 'hot' than 'popular'
In [9]: model.similarity('hot', 'popular')
Out[9]: 0.33708479049537632
Metode Wordnet NLTK tampaknya menyerah begitu saja:
In [25]: print wn.synset('hot.a.01').path_similarity(wn.synset('warm.a.01'))
None
Apa pilihan lain?
nlp
word-embeddings
word2vec
nltk
Thomas Johnson
sumber
sumber
Jawaban:
Word2vec tidak menangkap kesamaan berdasarkan antonim dan sinonim. Word2vec akan memberikan kesamaan yang lebih tinggi jika kedua kata tersebut memiliki konteks yang sama. Misalnya Cuaca di California adalah _____. Kosong bisa diisi oleh panas dan dingin maka kesamaannya akan lebih tinggi. Konsep ini disebut hubungan Paradigmatic.
Jika Anda tertarik untuk menangkap relasi seperti hypernym, hiponim, sinonim, antonim, Anda harus menggunakan ukuran kesamaan berdasarkan wordnet. Ada banyak ukuran kesamaan berdasarkan wordnet. Anda dapat memeriksa tautan ini http://ws4jdemo.appspot.com/
sumber
Dalam Text Analytic Tools for Semantic Similarity , mereka mengembangkan algoritma untuk menemukan kesamaan antara 2 kalimat. Tetapi jika Anda membaca dengan seksama, mereka menemukan kesamaan kata dalam matriks dan dijumlahkan bersama untuk mengetahui kesamaan antara kalimat. Jadi, ini mungkin kesempatan untuk memeriksa kesamaan kata.
Juga di SimLex-999: Mengevaluasi Model Semantik Dengan Estimasi Kesamaan (Asli) , mereka menjelaskan perbedaan antara
association
dansimilarity
yang mungkin merupakan alasan untuk pengamatan Anda juga. Misalnya, kopi dan cangkir. Mereka tidak serupa tetapi mereka asosiatif. Jadi hanya mempertimbangkan kesamaan akan memberikan hasil yang berbeda. Para penulis menyarankan berbagai model untuk memperkirakannya.sumber
Word2vec adalah titik awal yang baik untuk sebagian besar skenario. Ini tidak capture semantik dengan cara prediksi menggunakan metode CBOW. Ini memungkinkan terjemahan (seperti contoh paling berulang yang bisa saya taruh di sini lagi), V (Raja) - V (Ratu) ~~ V (laki-laki) - V (perempuan) dan sebagainya.
Jadi apa masalahnya? Masalahnya terletak pada ambiguitas arti kata. Setiap kali kata itu sendiri memiliki dua makna yang berbeda dalam dua konteks yang berbeda, vektor kata akan cenderung benar-benar jauh dari konteks mana pun. Python ~ Boa (keduanya ular) dan Python - Jawa (keduanya bahasa pemrograman) ..
Ada alternatif?
Untuk tujuan yang sangat spesifik dari "sinonim" jika Anda menginginkan Wordnet akan menjadi tempat yang ideal. Ini menangkap hubungan eksplisit dari dua kata daripada hubungan implisit berdasarkan penggunaan dan kemunculannya.
Wordnet sebagian besar dibuat sebagai kamus - di mana sebagai word2vec ditambang oleh penggunaan.
sumber
Dalam konteks tata bahasa gratis, saya pikir sangat tidak mungkin untuk menentukan kedekatan kata-kata. Yang bisa Anda lakukan adalah menggunakan vektor leksikon dan kemudian jika sebuah kata memiliki nilai yang dekat antara dua leksikon maka nilainya harus dekat.
sumber