Saya sedang mengerjakan masalah di mana saya perlu menentukan apakah dua kalimat itu sama atau tidak. Saya mengimplementasikan solusi menggunakan algoritme BM25 dan sinkronisasi wordnet untuk menentukan kesamaan sintaksis & semantik. Solusinya bekerja dengan baik, dan bahkan jika urutan kata dalam kalimat itu campur aduk, itu mengukur bahwa dua kalimat serupa. Sebagai contoh
- Python adalah bahasa yang baik.
- Bahasa python yang bagus adalah.
Masalah saya adalah menentukan bahwa kedua kalimat ini serupa.
- Apa yang bisa menjadi solusi untuk kesamaan struktural?
- Bagaimana saya mempertahankan struktur kalimat?
natural-language-processing
python
Shubham Tiwari
sumber
sumber
Jawaban:
Cara termudah untuk menambahkan semacam ukuran kesamaan struktural adalah dengan menggunakan n-gram; dalam kasus Anda bigrams mungkin cukup.
Telusuri setiap kalimat dan kumpulkan pasangan kata, seperti:
Kalimat Anda yang lain sudah
Dari delapan bigrams Anda memiliki dua yang sama ("python is" dan "a good"), sehingga Anda dapat mengatakan bahwa kesamaan strukturalnya adalah 2/8.
Tentu saja Anda juga bisa lebih fleksibel jika Anda sudah tahu bahwa dua kata itu terkait secara semantik. Jika Anda ingin mengatakan bahwa Python adalah bahasa yang baik secara struktural mirip / identik dengan Java adalah bahasa yang hebat , maka Anda dapat menambahkannya ke perbandingan sehingga Anda secara efektif memproses "[PROG_LANG] adalah bahasa [POSITIF-ADJ] bahasa", atau yang serupa.
sumber
Pertama, sebelum kami mulai, saya sarankan Anda merujuk ke pertanyaan serupa di jaringan seperti /datascience/25053/best-practical-algorithm-for-entent-similarity dan https: // stackoverflow. com / pertanyaan / 62328 / apakah-ada-sebuah-algoritma-yang-mengatakan-semantik-kesamaan-dari-dua-frase
Untuk menentukan kesamaan kalimat, kita perlu mempertimbangkan data apa yang kita miliki. Sebagai contoh jika Anda memiliki dataset berlabel yaitu kalimat yang sama dan kalimat yang berbeda maka pendekatan langsung bisa saja menggunakan algoritma yang diawasi untuk mengklasifikasikan kalimat.
Suatu pendekatan yang dapat menentukan kesamaan struktural kalimat adalah dengan rata-rata vektor kata yang dihasilkan oleh algoritma embedding kata yaitu word2vec. Algoritma ini membuat vektor untuk setiap kata dan persamaan cosinus di antara mereka mewakili kesamaan semantik di antara kata-kata. (Daniel L 2017)
Dengan menggunakan vektor kata, kita dapat menggunakan metrik berikut untuk menentukan kesamaan kata.
Kesamaan cosine adalah ukuran kesamaan antara dua vektor bukan-nol dari ruang produk dalam yang mengukur cosinus dari sudut di antara mereka. Sudut cosinus adalah ukuran tumpang tindih antara kalimat dalam hal kontennya.
Jarak Euclidean antara dua vektor kata memberikan metode yang efektif untuk mengukur kesamaan linguistik atau semantik dari kata-kata yang sesuai. (Frank D 2015)
Atau Anda dapat menghitung vektor eigen dari kalimat untuk menentukan kesamaan kalimat.
Vektor eigen adalah seperangkat vektor khusus yang terkait dengan sistem persamaan linear (yaitu persamaan matriks). Di sini matriks kesamaan kalimat dihasilkan untuk setiap cluster dan vektor eigen untuk matriks dihitung. Anda dapat membaca lebih lanjut tentang pendekatan Eigenvector berdasarkan peringkat kalimat di makalah ini https://pdfs.semanticscholar.org/ca73/bbc99be157074d8aad17ca8535e2cd956815.pdf
Untuk kode sumber, Siraj Rawal memiliki notebook Python untuk membuat satu set vektor kata. Kata vektor kemudian dapat digunakan untuk menemukan kesamaan antara kata-kata. Kode sumber tersedia di sini https://github.com/llSourcell/word_vectors_game_of_thrones-LIVE
Pilihan lain adalah tutorial dari Oreily yang memanfaatkan pustaka gensin Python untuk menentukan kesamaan antar dokumen. Tutorial ini menggunakan NLTK untuk menandai lalu membuat model tf-idf (istilah frekuensi-invers dokumen frekuensi) dari corpus. Tf-idf kemudian digunakan untuk menentukan kesamaan dokumen. Tutorialnya tersedia di sini https://www.oreilly.com/learning/how-do-i-compare-document-similarity-using-python
sumber
Pendekatan yang paling efisien sekarang adalah dengan menggunakan Universal Sentence Encoder oleh Google ( paper_2018 ) yang menghitung kesamaan semantik antara kalimat menggunakan produk titik embeddings mereka (yaitu vektor yang dipelajari dari nilai 215) . Kesamaan adalah angka mengambang antara 0 (yaitu tidak ada kesamaan) dan 1 (yaitu kesamaan kuat).
Implementasinya sekarang terintegrasi ke Tensorflow Hub dan dapat dengan mudah digunakan. Berikut ini adalah kode yang siap digunakan untuk menghitung kesamaan antara 2 kalimat. Di sini saya akan mendapatkan kesamaan antara "Python is a good language" dan "Language a good python is" seperti pada contoh Anda.
sumber