वाक्य समानता भविष्यवाणी


15

मैं निम्नलिखित समस्या को हल करने के लिए देख रहा हूं: मेरे पास मेरे डेटासेट के रूप में वाक्यों का एक सेट है, और मैं एक नया वाक्य टाइप करने में सक्षम होना चाहता हूं, और यह वाक्य ढूंढना चाहता हूं कि नया डेटासेट में सबसे समान है। एक उदाहरण जैसा दिखेगा:

नया वाक्य: " I opened a new mailbox"

डेटासेट पर आधारित भविष्यवाणी:

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

मैंने पढ़ा है कि इस प्रकार के मुद्दों को tf-idf (और RNN को मूल तरीकों में महत्वपूर्ण सुधार नहीं लाने चाहिए) को हल करने के लिए cosine समानता का उपयोग किया जा सकता है, या समान समस्याओं के लिए भी word2vec का उपयोग किया जाता है। क्या वे वास्तव में इस विशिष्ट मामले में उपयोग के लिए व्यवहार्य हैं? क्या इसे हल करने के लिए कोई अन्य तकनीक / एल्गोरिदम हैं (अधिमानतः पायथन और SKLearn के साथ, लेकिन मैं TensorFlow के बारे में जानने के लिए खुला हूं, भी)?


निश्चित रूप से बर्थ की जांच करें । यहाँ एक अच्छा कार्यान्वयन है । यह वही करता है जो आप बहुत अच्छे परिणामों के साथ देख रहे हैं
GioGio

जवाबों:


26

आपकी समस्या Word2vec के साथ-साथ Doc2vec से हल की जा सकती है। Doc2vec बेहतर परिणाम देगा क्योंकि यह मॉडल को प्रशिक्षित करते समय वाक्यों को ध्यान में रखता है।

Doc2vec समाधान
आप इस लिंक के बाद अपने doc2vec मॉडल को प्रशिक्षित कर सकते हैं । आप कुछ पूर्व-प्रसंस्करण कदम जैसे सभी स्टॉप शब्द ("जैसे", "ए", आदि जो वाक्य में बहुत अर्थ नहीं जोड़ते हैं) को हटाना चाहते हैं । एक बार जब आप अपने मॉडल को प्रशिक्षित करते हैं, तो आप निम्न कोड का उपयोग करके समान वाक्य पा सकते हैं।

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)

परिणाम:

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

उपरोक्त परिणाम के लिए tuples की सूची है (label,cosine_similarity_score)। आप आउटपुट को वाक्यों से मैप कर सकते हैं train[29670]

कृपया ध्यान दें कि उपरोक्त दृष्टिकोण केवल अच्छे परिणाम देगा यदि आपके doc2vec मॉडल में नए वाक्य में पाए गए शब्दों के लिए एम्बेडिंग शामिल है। यदि आप कुछ गिबरिश वाक्य की तरह समानता प्राप्त करने की कोशिश करते हैं sdsf sdf f sdf sdfsdffg, तो यह आपको कुछ परिणाम देगा, लेकिन वे वास्तविक समान वाक्य नहीं हो सकते हैं क्योंकि आपके प्रशिक्षित मॉडल ने मॉडल को प्रशिक्षित करते समय इन अस्पष्ट शब्दों को नहीं देखा होगा। इसलिए बेहतर परिणामों के लिए अधिक से अधिक शब्दों को शामिल करने के लिए अपने मॉडल को यथासंभव कई वाक्यों पर प्रशिक्षित करने का प्रयास करें।

Word2vec समाधान
यदि आप word2vec का उपयोग कर रहे हैं, तो आपको प्रत्येक वाक्य में सभी शब्दों के लिए औसत वेक्टर की गणना करने और वैक्टर के बीच कोसाइन समानता का उपयोग करने की आवश्यकता है।

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

समानता की गणना करें

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)

धन्यवाद! सप्ताहांत में इस पर काम करेंगे, लेकिन पहली नज़र में समाधान एकदम सही लगता है। कुडोस!
lte__

क्या हमें प्रशिक्षण के लिए वाक्यों को
टोकना होगा

हाँ @pyd हमें करना है! sentence_1.split()वही करता है।
हरमन

4

वर्ड मूवर की दूरी (WMD) वाक्यों के बीच की दूरी को खोजने के लिए एक एल्गोरिथ्म है। WMD शब्द एम्बेडिंग (उदाहरण के लिए, word2vec) पर आधारित है, जो शब्दों के अर्थ को सघन वैक्टर में कूटबद्ध करता है।

WMD दूरी दो पाठ दस्तावेजों के बीच की दूरी की न्यूनतम मात्रा के रूप में असमानता को मापता है कि एक दस्तावेज़ के एम्बेडेड शब्दों को दूसरे दस्तावेज़ के एम्बेडेड शब्दों तक पहुंचने के लिए "यात्रा" करने की आवश्यकता होती है।

उदाहरण के लिए:

यहाँ छवि विवरण दर्ज करें स्रोत: "वर्ड एंबेडिंग से दस्तावेज़ में गड़बड़ी" पेपर

Gensim पैकेज एक है सामूहिक नरसंहार के हथियारों कार्यान्वयन

अपनी समस्या के लिए, आप इनपुट किए गए वाक्य की तुलना अन्य सभी वाक्यों से करेंगे और उस वाक्य को लौटाएंगे जिसमें WMD सबसे कम है।


2

आप स्केलेर का उपयोग करके एक आसान समाधान की कोशिश कर सकते हैं और यह ठीक काम करने वाला है।

  • प्रत्येक पाठ का वेक्टर प्रतिनिधित्व प्राप्त करने के लिए tfidfvectorizer का उपयोग करें

  • स्टॉप-शब्द को हटाते हुए, अपने डेटा के साथ वेक्टर को फिट करें।

  • पहले से प्रशिक्षित सदिश के साथ नई प्रविष्टि का रूपांतरण करें

  • इस प्रतिनिधित्व और आपके डेटा सेट में तत्वों के प्रत्येक प्रतिनिधित्व के बीच कॉस्मिक समानता की गणना करें ।

यदि आपके पास एक ह्यूग डेटासेट है, तो आप प्रतिनिधित्व प्राप्त करने के बाद, और नए डेटा पर भविष्यवाणी करने से पहले इसे क्लस्टर कर सकते हैं (उदाहरण के लिए scikit से केमर्स का उपयोग करके)।

यह कोड इन सभी चरणों को पूरा करता है। आप इसे मेरे जीथब रेपो पर देख सकते हैं ।

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

अरे, यह वास्तव में अच्छा होगा यदि आप कोसाइन सिमिलिरिटी का उपयोग करने का एक उदाहरण दिखा सकते हैं?
Tido

अरे, भाग 2 पहले नहीं आना चाहिए, अल डेटा पर फिट है और प्रत्येक पाठ को बदलने के लिए इसका उपयोग करें? यह वास्तव में अच्छा होगा यदि आप कोसाइन सिमिलिरिटी का उपयोग करने का एक उदाहरण दिखा सकते हैं?
Tido

1

RNN मॉडल में वैरिएबल ऑटो-एनकोडर पर आधारित कुछ हालिया काम हैं। एक सतत अंतरिक्ष से वाक्य उत्पन्न करना , पाइरॉच कार्यान्वयन के साथ: जीथब कोड
वे कुछ अव्यक्त स्थान में एक वाक्य के शब्दार्थिक, वाक्यगत वैश्विक विशेषता को संपीड़ित करने में कामयाब रहे, शायद कुछ परिमित 10 से 30 स्वतंत्र यादृच्छिक चर (कारक वितरण) के साथ।
इस काम में उपन्यास का विचार, वे दो वाक्यों के बीच अंतर करते हैं। और परिणाम काफी आश्चर्यजनक थे।


0

सामान्यीकृत समाधान में निम्न चरण होते हैं -

  1. एक वाक्य के करतब या शब्द एम्बेडिंग।
  2. वाक्यों के बीच एक समानता मीट्रिक लागू करना।

nXnnXdd

एक बार जब आप प्रत्येक शब्द का शब्द एम्बेडिंग प्राप्त कर लेते हैं, तो आप दूसरों के साथ समानता को मापने के लिए प्रत्येक वाक्य पर किसी भी समानता के मैट्रिक्स जैसे कोसिन समानता, आदि को लागू कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.