Cümle benzerlik tahmini


15

Aşağıdaki sorunu çözmek istiyorum: Veri kümem olarak bir dizi cümleyim var ve yeni bir cümle yazabilmek ve yeni kümenin veri kümesindeki en çok benzediği cümleyi bulmak istiyorum. Bir örnek şöyle görünecektir:

Yeni cümle: " I opened a new mailbox"

Veri kümesine dayalı tahmin:

Sentence                       | Similarity
A dog ate poop                   0%
A mailbox is good                50%
A mailbox was opened by me       80%

Kosinüs benzerliğinin , tf-idf ile eşleştirilmiş bu tür sorunları çözmek için kullanılabileceğini okudum (ve RNN'ler temel yöntemlere önemli iyileştirmeler getirmemelidir) veya aynı problemler için word2vec kullanılır. Bunlar gerçekten de bu özel durumda kullanım için uygun mudur? Bunu çözmek için başka teknikler / algoritmalar var mı (tercihen Python ve SKLearn ile, ama ben de TensorFlow'u öğrenmeye açıkım)?


Kesinlikle Bert'i kontrol et . İşte güzel bir uygulama . Tam olarak aradığınız şeyi oldukça iyi sonuçlarla yapıyor
GioGio

Yanıtlar:


26

Sorununuz Word2vec ve Doc2vec ile çözülebilir. Doc2vec daha iyi sonuçlar verir çünkü modeli eğitirken cümleleri dikkate alır.

Doc2vec çözümü
Bu bağlantıyı izleyerek doc2vec modelinizi eğitebilirsiniz . Tüm durdurma sözcüklerini ("cümle'ye fazla bir anlam katmayan", "," an "vb.) Kaldırmak gibi bazı ön işleme adımları uygulamak isteyebilirsiniz . Modelinizi eğittikten sonra, aşağıdaki kodları kullanarak benzer cümleler bulabilirsiniz.

import gensim  

model = gensim.models.Doc2Vec.load('saved_doc2vec_model')  

new_sentence = "I opened a new mailbox".split(" ")  
model.docvecs.most_similar(positive=[model.infer_vector(new_sentence)],topn=5)

Sonuçlar:

[('TRAIN_29670', 0.6352514028549194),
 ('TRAIN_678', 0.6344441771507263),
 ('TRAIN_12792', 0.6202734708786011),
 ('TRAIN_12062', 0.6163255572319031),
 ('TRAIN_9710', 0.6056315898895264)]

Yukarıdaki sonuçlar için tuples listesi (label,cosine_similarity_score). Çıktıları cümlelerle eşleyerek eşleştirebilirsiniz train[29670].

Yukarıdaki yaklaşımın yalnızca doc2vec modelinizde yeni cümlede bulunan kelimeler için düğünler varsa iyi sonuçlar vereceğini lütfen unutmayın. Gibi bazı anlamsız cümle için benzerlik elde etmeye çalışırsanız sdsf sdf f sdf sdfsdffg, size birkaç sonuç verecektir, ancak bunlar gerçek antrenman modeliniz olmayabilir, çünkü eğitimli modeliniz modeli eğitirken bu anlamsız kelimeleri görmemiş olabilir. Bu nedenle, daha iyi sonuçlar elde etmek için modelinizi mümkün olduğunca çok cümle üzerinde eğitmeye çalışın.

Word2vec Çözümü word2vec
kullanıyorsanız, her cümledeki tüm kelimeler için ortalama vektörü hesaplamanız ve vektörler arasında kosinüs benzerliğini kullanmanız gerekir.

def avg_sentence_vector(words, model, num_features, index2word_set):
    #function to average all words vectors in a given paragraph
    featureVec = np.zeros((num_features,), dtype="float32")
    nwords = 0

    for word in words:
        if word in index2word_set:
            nwords = nwords+1
            featureVec = np.add(featureVec, model[word])

    if nwords>0:
        featureVec = np.divide(featureVec, nwords)
    return featureVec

Benzerliği Hesapla

from sklearn.metrics.pairwise import cosine_similarity

#get average vector for sentence 1
sentence_1 = "this is sentence number one"
sentence_1_avg_vector = avg_sentence_vector(sentence_1.split(), model=word2vec_model, num_features=100)

#get average vector for sentence 2
sentence_2 = "this is sentence number two"
sentence_2_avg_vector = avg_sentence_vector(sentence_2.split(), model=word2vec_model, num_features=100)

sen1_sen2_similarity =  cosine_similarity(sentence_1_avg_vector,sentence_2_avg_vector)

Teşekkür ederim! Hafta sonu boyunca bunun üzerinde çalışacak, ancak çözüm ilk bakışta mükemmel görünüyor. Kudos!
lte__

eğitim cümleleri tokenize gerekir
pyd

evet @ pyd zorundayız! sentence_1.split()aynısını yapar.
Harman

4

Word Mover's Distance (WMD) , cümleler arasındaki mesafeyi bulmak için bir algoritmadır. KİS, kelimelerin anlamsal anlamını yoğun vektörlere kodlayan kelime düğünlerine (örneğin, word2vec) dayanmaktadır.

KİS mesafesi, iki metin belgesi arasındaki farklılığı, bir belgenin gömülü kelimelerinin başka bir belgenin gömülü kelimelerine ulaşmak için "seyahat etmesi" gereken minimum mesafe miktarı olarak ölçer.

Örneğin:

resim açıklamasını buraya girin Kaynak: "Word Yerleştirmelerinden Belge Mesafelerine" Makalesi

Gensim paket bir sahiptir KİS uygulamasını .

Sorununuz için, girilen cümleyi diğer tüm cümle ile karşılaştırır ve en düşük WMD'ye sahip cümleyi döndürürsünüz.


2

Sklearn kullanarak kolay bir çözüm deneyebilirsiniz ve işe yarayacaktır.

  • Her metnin vektör temsilini almak için tfidfvectorizer kullanın

  • Fit kaldırarak, sizin verilerle vectorizer dur-kelimeleri.

  • Yeni girişi önceden eğitilmiş vectorizer ile dönüştürün

  • Bu gösterim ile veri kümenizdeki öğelerin her bir gösterimi arasındaki kosinüs benzerliğini hesaplayın .

Bir hugh veri kümeniz varsa, temsili aldıktan sonra ve yeni verileri tahmin etmeden önce kümeleyebilirsiniz (örneğin, scikit öğrenmesinden KMeans kullanarak).

Bu kod tüm bu adımları gerçekleştirir. Sen benim github repo kontrol edebilirsiniz .

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score
import numpy

texts = ["This first text talks about houses and dogs",
        "This is about airplanes and airlines",
        "This is about dogs and houses too, but also about trees",
        "Trees and dogs are main characters in this story",
        "This story is about batman and superman fighting each other", 
        "Nothing better than another story talking about airplanes, airlines and birds",
        "Superman defeats batman in the last round"]

# vectorization of the texts
vectorizer = TfidfVectorizer(stop_words="english")
X = vectorizer.fit_transform(texts)
# used words (axis in our multi-dimensional space)
words = vectorizer.get_feature_names()
print("words", words)


n_clusters=3
number_of_seeds_to_try=10
max_iter = 300
number_of_process=2 # seads are distributed
model = KMeans(n_clusters=n_clusters, max_iter=max_iter, n_init=number_of_seeds_to_try, n_jobs=number_of_process).fit(X)

labels = model.labels_
# indices of preferible words in each cluster
ordered_words = model.cluster_centers_.argsort()[:, ::-1]

print("centers:", model.cluster_centers_)
print("labels", labels)
print("intertia:", model.inertia_)

texts_per_cluster = numpy.zeros(n_clusters)
for i_cluster in range(n_clusters):
    for label in labels:
        if label==i_cluster:
            texts_per_cluster[i_cluster] +=1 

print("Top words per cluster:")
for i_cluster in range(n_clusters):
    print("Cluster:", i_cluster, "texts:", int(texts_per_cluster[i_cluster])),
    for term in ordered_words[i_cluster, :10]:
        print("\t"+words[term])

print("\n")
print("Prediction")

text_to_predict = "Why batman was defeated  by superman so easy?"
Y = vectorizer.transform([text_to_predict])
predicted_cluster = model.predict(Y)[0]
texts_per_cluster[predicted_cluster]+=1

print(text_to_predict)
print("Cluster:", predicted_cluster, "texts:", int(texts_per_cluster[predicted_cluster])),
for term in ordered_words[predicted_cluster, :10]:
print("\t"+words[term])

Hey, kosinüs benzerliğini kullanarak bir örnek gösterebilirseniz gerçekten güzel olur mu?
Tido

Hey, önce bölüm 2 gelmemeli, tüm verilere uymalı ve bunu her metni dönüştürmek için kullanmamalı mı? Kosinüs benzerliğini kullanma örneğini gösterebilmeniz gerçekten güzel olur mu?
Tido

1

RNN modellerinde Variational Auto-Encoder tabanlı bazı çalışmalar var. Pytorch uygulamaları ile Sürekli Uzaydan Cümle Oluşturma : github kodu .
bir cümlenin anlamsal, sözdizimsel küresel özelliğini, belki de sonlu 10 ila 30 bağımsız rastgele değişkenle (çarpanlara ayrılmış dağılım) ifade edilen gizli bir alana sıkıştırmayı başardılar.
Bu çalışmadaki yeni fikir, iki cümle arasında enterpolasyon yapıyorlar. ve sonuçlar oldukça şaşırtıcıydı.


0

Genelleştirilmiş çözüm aşağıdaki adımlardan oluşur -

  1. Bir cümlenin özellikli veya sözcükli düğünleri.
  2. Cümleler arasında benzerlik metriği uygulama.

nXnnXdd

Her bir kelimenin kelime yerleştirmesini aldıktan sonra, diğerleriyle benzerliği ölçmek için her cümleye kosinüs benzerliği vb. Benzerlik metriklerinden herhangi birini uygulayabilirsiniz.

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.