Cümleler arasındaki yapısal benzerliği nasıl hesaplayabilirim?


12

İki cümlenin benzer olup olmadığını belirlemem gereken bir sorun üzerinde çalışıyorum. Sözdizimsel ve anlamsal benzerliği belirlemek için BM25 algoritması ve wordnet sistemlerini kullanarak bir çözüm uyguladım. Çözüm yeterince çalışıyor ve cümlelerdeki kelime sırası karışık olsa bile, iki cümlenin benzer olduğunu ölçüyor. Örneğin

  1. Python iyi bir dildir.
  2. İyi bir python dilidir.

Benim sorunum, bu iki cümlenin benzer olduğunu belirlemektir.

  • Yapısal benzerlik için olası çözüm ne olabilir?
  • Cümlelerin yapısını nasıl koruyacağım?

Cümle vektörlerini kullanabilir ve karşılaştırabilirsiniz.
Aiden Grossman

Bu görev için Gensim'i ( radimrehurek.com/gensim ) kullanmanızı şiddetle tavsiye ederim . Özellikle LSI ve / veya word2vec ve fasttext modelleri
Robin

Yanıtlar:


2

Bir çeşit yapısal benzerlik ölçüsü eklemenin en kolay yolu n-gram kullanmaktır; sizin durumunuzda bigram yeterli olabilir.

Her cümleyi gözden geçirin ve aşağıdaki gibi kelime çiftlerini toplayın:

  • "python", "bir", "iyi", "iyi dil" dir.

Diğer cümlenin

  • "dil a", "iyi", "iyi python", "python" dır.

Sekiz bigramdan ikisi aynıdır ("python" ve "iyi"), dolayısıyla yapısal benzerliğin 2/8 olduğunu söyleyebilirsiniz.

Elbette, iki kelimenin anlamsal olarak ilişkili olduğunu zaten biliyorsanız, daha esnek olabilirsiniz. Python'un iyi bir dil olduğunu, Java'ya yapısal olarak benzer / özdeş olduğunu söylemek istiyorsanız, büyük bir dildir , o zaman bunu karşılaştırmaya ekleyebilirsiniz, böylece "[PROG_LANG] bir [POZİTİF-ADJ dilidir”, Veya benzeri.


5

İlk olarak, başlamadan önce ağdaki /datascience/25053/best-practical-algorithm-for-sentence-screteity ve https: // stackoverflow gibi benzer sorulara başvurmanızı öneririz . com / sorular / 62328 / is-orada-bir-algoritma-o-anlatır-semantik-benzerlik-of-iki-cümleleri

Cümlelerin benzerliğini belirlemek için ne tür verilere sahip olduğumuzu düşünmeliyiz. Örneğin, etiketlenmiş bir veri kümeniz varsa, örneğin benzer cümleler ve benzer cümleler varsa, doğrudan bir yaklaşım, cümleleri sınıflandırmak için denetimli bir algoritma kullanmak olabilirdi.

Cümlenin yapısal benzerliğini belirleyebilen bir yaklaşım, kelime gömme algoritmaları, yani word2vec tarafından üretilen kelime vektörlerinin ortalamasını almak olacaktır. Bu algoritmalar her kelime için bir vektör oluşturur ve aralarındaki kosinüs benzerliği kelimeler arasındaki anlamsal benzerliği temsil eder. (Daniel L 2017)

Kelime vektörlerini kullanarak, kelimelerin benzerliğini belirlemek için aşağıdaki metrikleri kullanabiliriz.

  • Kelimelerin kelime düğünleri arasındaki kosinüs mesafesi
  • Kelimelerin kelime düğünleri arasında Öklid mesafesi

Kosinüs benzerliği, bir iç ürün boşluğunun sıfır olmayan iki vektörü arasındaki, aralarındaki açının kosinüsünü ölçen benzerliğin bir ölçüsüdür. Kosinüs açısı, cümle arasındaki içerik bakımından örtüşme ölçüsüdür.

İki sözcük vektörü arasındaki Öklid mesafesi, karşılık gelen kelimelerin dilbilimsel veya anlamsal benzerliğini ölçmek için etkili bir yöntem sağlar. (Frank D 2015)

Alternatif olarak, cümle benzerliğini belirlemek için cümlelerin özvektörünü hesaplayabilirsiniz.

Özvektörler doğrusal bir denklem sistemi (yani matris denklemi) ile ilişkili özel bir vektörler kümesidir. Burada her küme için bir cümle benzerlik matrisi oluşturulur ve matris için özvektör hesaplanır. Bu makalede cümle sıralamasına Özvektör tabanlı yaklaşım hakkında daha fazla bilgi edinebilirsiniz https://pdfs.semanticscholar.org/ca73/bbc99be157074d8aad17ca8535e2cd956815.pdf

Kaynak kodu için Siraj Rawal, bir dizi kelime vektörü oluşturmak için bir Python not defterine sahiptir. Kelime vektörleri daha sonra kelimeler arasındaki benzerliği bulmak için kullanılabilir. Kaynak kodu burada bulunabilir https://github.com/llSourcell/word_vectors_game_of_thrones-LIVE

Başka bir seçenek, Oreily'den, belgeler arasındaki benzerliği belirlemek için gensin Python kütüphanesini kullanan bir öğreticidir. Bu eğitici tokenize etmek için NLTK kullanır, sonra da şirketten bir tf-idf (terim frekansı ters belge frekansı) modeli oluşturur. Daha sonra tf-idf, belgelerin benzerliğini belirlemek için kullanılır. Eğiticiye buradan ulaşabilirsiniz https://www.oreilly.com/learning/how-do-i-compare-document-slikeity-using-python


Sorun için değerli ayrıntılar sağladığınız için teşekkür ederiz. Gensim örneğini görmüştüm ama bir soru var, bu soruda bahsettiğim sorunu çözebilecek mi? Oluşturduğum çözüm, cümleler arasındaki benzerliği bulmakta iyi çalışıyor olsa da, kelimelerin sırası karıştığında sıkışıyor.
Shubham Tiwari

4

Şu anki en iyi yaklaşım (2019):

En verimli yaklaşım şimdi kullanmaktır Google tarafından Evrensel Cümle Encoder ( paper_2018 kendi tespitlerinin dot ürünü kullanmadan cümle arasında anlamsal benzerlik hesaplar) (yani 215 değerlerin vektörleri öğrenilen) . Benzerlik, 0 (yani benzerlik yok) ile 1 (yani güçlü benzerlik) arasındaki bir kayan sayıdır .

Uygulama şimdi Tensorflow Hub'a entegre edildi ve kolayca kullanılabilir. İşte 2 cümle arasındaki benzerliği hesaplamak için kullanıma hazır bir kod. Burada "Python iyi bir dildir" ve "İyi bir python'un dilidir" arasındaki benzerliği alacağım .

Kod örneği:

#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)

Çıktı:

Similarity is 0.90007496 #Strong similarity

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.