Bagaimana saya menghitung kesamaan struktural antara kalimat?

12

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

  1. Python adalah bahasa yang baik.
  2. 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?
Shubham Tiwari
sumber
Anda mungkin dapat menggunakan vektor kalimat dan membandingkannya.
Aiden Grossman
Saya sangat menyarankan Anda untuk menggunakan Gensim ( radimrehurek.com/gensim ) untuk tugas ini. Terutama model LSI dan / atau word2vec dan fasttext
Robin

Jawaban:

2

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:

  • "python is", "is a", "a good", "good language".

Kalimat Anda yang lain sudah

  • "bahasa a", "a good", "good python", "python is".

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.

Oliver Mason
sumber
5

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.

  • Jarak cosine antara embeddings kata dari kata
  • Jarak Euclidean antara embeddings kata dari kata-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

Seth Simba
sumber
Terima kasih telah memberikan detail berharga untuk masalahnya. Saya telah melihat contoh gensim tetapi saya punya pertanyaan apakah ini dapat menyelesaikan masalah yang saya sebutkan tadi. Meskipun solusi yang saya buat bekerja dengan baik dalam menemukan kesamaan antara kalimat tetapi semakin macet ketika urutan kata-kata tercampur aduk.
Shubham Tiwari
4

Pendekatan terbaik saat ini (2019):

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.

Contoh kode:

#Requirements: Tensorflow>=1.7 tensorflow-hub numpy

import tensorflow as tf
import tensorflow_hub as hub
import numpy as np

module_url = "https://tfhub.dev/google/universal-sentence-encoder-large/3" 
embed = hub.Module(module_url)
sentences = ["Python is a good language","Language a good python is"]

similarity_input_placeholder = tf.placeholder(tf.string, shape=(None))
similarity_sentences_encodings = embed(similarity_input_placeholder)

with tf.Session() as session:
  session.run(tf.global_variables_initializer())
  session.run(tf.tables_initializer())
  sentences_embeddings = session.run(similarity_sentences_encodings, feed_dict={similarity_input_placeholder: sentences})
  similarity = np.inner(sentences_embeddings[0], sentences_embeddings[1])
  print("Similarity is %s" % similarity)

Keluaran:

Similarity is 0.90007496 #Strong similarity
HLeb
sumber
Opsi lain di 2019 adalah embeddings kalimat BERT - Anda dapat melihat contoh kode di sini - github.com/hanxiao/bert-as-service
Adnan S