বাক্যটির মিলের পূর্বাভাস


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%

আমি পড়েছি যে টিএসএফ-আইডিএফ (এবং আরএনএনগুলি বেসিক পদ্ধতিগুলিতে উল্লেখযোগ্য উন্নতি না করা উচিত) এর সাথে যুক্ত এই ধরণের সমস্যাগুলির সমাধানের জন্য কোসাইন সাদৃশ্য ব্যবহার করা যেতে পারে, বা একইভাবে সমস্যার জন্য ওয়ার্ড 2vec ব্যবহৃত হয়। এগুলিও কি এই নির্দিষ্ট ক্ষেত্রে ব্যবহারের পক্ষে আসলে কার্যকর? এটি সমাধান করার জন্য কি অন্য কোন কৌশল / অ্যালগরিদম রয়েছে (সাধারণত পাইথন এবং এসকে্লার্নের সাথে, তবে আমি টেনসরফ্লো সম্পর্কেও শিখতে পেরেছি)?


অবশ্যই বার্ট চেক করুন । এখানে একটি সুন্দর বাস্তবায়ন । এটি বেশ ভাল ফলাফলের সাথে আপনি যা সন্ধান করছেন ঠিক তা করে
জিওজিও

উত্তর:


26

আপনার সমস্যাটি ওয়ার্ড 2vec এর সাথে ডক 2 ওয়েভ দিয়েও সমাধান করা যেতে পারে। ডকুভেক আরও ভাল ফলাফল দেবে কারণ এটি মডেলকে প্রশিক্ষণ দেওয়ার সময় বাক্যগুলিকে বিবেচনা করে।

ডক 2vec সমাধান
আপনি এই লিঙ্কটি অনুসরণ করে আপনার ডক 2vec মডেলটিকে প্রশিক্ষণ দিতে পারেন । আপনি কিছু স্টপ শব্দগুলি মুছে ফেলার মতো কিছু প্রাক-প্রক্রিয়াজাতকরণ পদক্ষেপগুলি সম্পাদন করতে চাইতে পারেন ("দ্য", "একটি" ইত্যাদি শব্দগুলি যা বাক্যে খুব বেশি অর্থ যোগ করে না)। আপনি একবার আপনার মডেলকে প্রশিক্ষণ দিলে নিম্নলিখিত কোড ব্যবহার করে অনুরূপ বাক্যগুলি খুঁজে পেতে পারেন।

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

উপরের ফলাফলগুলির জন্য টিপলগুলির তালিকা (label,cosine_similarity_score)। আপনি বাক্যগুলিতে আউটপুট মানচিত্র করতে পারেন train[29670]

দয়া করে মনে রাখবেন যে উপরের পদ্ধতিরটি কেবলমাত্র ভাল ফলাফল দেবে যদি আপনার ডক 2 ওয়েভ মডেলটিতে নতুন বাক্যে পাওয়া শব্দের জন্য এম্বেডিং থাকে। আপনি যদি কিছু গীব্রিশ বাক্যটির মতো সাদৃশ্য পেতে চেষ্টা করেন তবে sdsf sdf f sdf sdfsdffgএটি আপনাকে কয়েকটি ফলাফল দেবে, তবে প্রকৃত মিলের বাক্যগুলি নাও হতে পারে কারণ আপনার প্রশিক্ষিত মডেলটি মডেলটিকে প্রশিক্ষণ দেওয়ার সময় এই জিবির শব্দগুলি দেখতে পায় নি। সুতরাং আরও ভাল ফলাফলের জন্য যতগুলি শব্দ অন্তর্ভুক্ত করার জন্য আপনার মডেলটিকে যথাসম্ভব বাক্যে প্রশিক্ষণের চেষ্টা করুন।

ওয়ার্ড 2vec সলিউশন
যদি আপনি ওয়ার্ড 2vec ব্যবহার করে থাকেন তবে আপনাকে প্রতিটি বাক্যে সমস্ত শব্দের জন্য গড় ভেক্টর গণনা করতে হবে এবং ভেক্টরগুলির মধ্যে কোসাইন মিল খুঁজে পাওয়া দরকার।

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__ 9

প্রশিক্ষণের জন্য আমাদের কি বাক্যগুলি
টোকনাইজ করতে হবে

হ্যাঁ @PYD আমাদের আছে! sentence_1.split()একই কাজ করে।
হারমান

4

শব্দ মোভারের দূরত্ব (ডাব্লুএমডি) বাক্যগুলির মধ্যে দূরত্ব নির্ধারণের জন্য একটি অ্যালগরিদম। ডাব্লুএমডি শব্দের এমবেডিংগুলি (উদাহরণস্বরূপ, ওয়ার্ড 2vec) এর উপর ভিত্তি করে যা শব্দের অর্থগত ঘন ভেক্টরগুলিতে এনকোড করে।

ডাব্লুএমডি দূরত্ব দুটি পাঠ্য নথির মধ্যে ভিন্নতা পরিমাপ করে যে কোনও নথির এম্বেড শব্দগুলিকে অন্য নথির এম্বেড শব্দগুলিতে পৌঁছানোর জন্য "ভ্রমণ" করতে হবে এমন ন্যূনতম পরিমাণের দূরত্ব হিসাবে।

উদাহরণ স্বরূপ:

এখানে চিত্র বর্ণনা লিখুন উত্স: "ওয়ার্ড এম্বেডিং থেকে ডকুমেন্ট দূরত্বের" কাগজ

Gensim প্যাকেজ টি WMD বাস্তবায়ন

আপনার সমস্যার জন্য, আপনি ইনপুটড বাক্যটি অন্য সমস্ত বাক্যের সাথে তুলনা করে এবং সর্বনিম্ন ডাব্লুএমডি বাক্যটি ফিরিয়ে আনতেন।


2

আপনি স্কেলার্ন ব্যবহার করে একটি সহজ সমাধান চেষ্টা করতে পারেন এবং এটি দুর্দান্ত কাজ করছে।

  • প্রতিটি পাঠ্যের ভেক্টর উপস্থাপনা পেতে tfidfvectorizer ব্যবহার করুন

  • স্টপ-শব্দগুলি সরিয়ে আপনার ডেটার সাথে ভেক্টরাইজারকে ফিট করুন

  • পূর্বে প্রশিক্ষিত ভেক্টরাইজারের সাহায্যে নতুন এন্ট্রি রূপান্তর করুন

  • এই উপস্থাপনা এবং আপনার ডেটা সেটের উপাদানগুলির প্রতিটি প্রতিনিধির মধ্যে কোসাইন মিলকে গণনা করুন ।

যদি আপনার কাছে হিউ ডেটাসেট থাকে তবে আপনি উপস্থাপনাটি পাওয়ার পরে এবং নতুন ডেটা সম্পর্কে ভবিষ্যদ্বাণী করার আগে এটি ক্লাস্টার করতে পারেন (উদাহরণস্বরূপ সাইকিট শিখুনের কে মিয়ানস ব্যবহার করে)।

এই কোডটি এই সমস্ত পদক্ষেপ সম্পাদন করে। তুমি আমার GitHub তে এটি পরীক্ষা করতে পারবেন রেপো

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

আরে, কোসাইন সিমিলিয়াইরিটি ব্যবহারের উদাহরণ দেখাতে পারলে সত্যিই ভালো লাগবে?
টিডো

আরে, প্রথম খণ্ডটি প্রথম হওয়া উচিত নয়, সমস্ত ডেটাতে ফিট করা উচিত এবং প্রতিটি পাঠ্যকে রূপান্তর করতে এটি ব্যবহার করবেন? সত্যিই চমৎকার লাগবে যদি আপনি কোজাইন সিমিলিয়াইরিটি ব্যবহারের উদাহরণ দেখিয়ে দিতে পারেন?
টিডো

1

আরএনএন মডেলগুলিতে ভেরিয়াল অটো-এনকোডার ভিত্তিক কিছু সাম্প্রতিক কাজ রয়েছে। পাইট্রাক বাস্তবায়নের সাথে একটি অবিচ্ছিন্ন স্থান থেকে বাক্য তৈরি করা হচ্ছে: গিথুব কোড
তারা কোনও বাক্যটির সিন্থেটিক, সিনট্যাকটিক গ্লোবাল বৈশিষ্ট্যটি কিছুটা সুপ্ত স্থানে প্রকাশ করতে পারে যা সম্ভবত কিছু সীমাবদ্ধ থেকে 10 থেকে 30 টি স্বতন্ত্র এলোমেলো ভেরিয়েবল (ফ্যাক্টরাইজড ডিস্ট্রিবিউশন) দিয়ে প্রকাশ করা হয়েছিল।
এই কাজের অভিনব ধারণা, তারা দুটি বাক্য মধ্যে বিভক্ত। এবং ফলাফল বেশ আশ্চর্যজনক ছিল।


0

সাধারণীকরণের সমাধানটি নিম্নলিখিত পদক্ষেপগুলি নিয়ে গঠিত -

  1. বৈশিষ্ট্য বা একটি বাক্য শব্দের এমবেডিং।
  2. বাক্যগুলির মধ্যে একটি মিল মেট্রিক প্রয়োগ করা।

nXnnXdd

একবার আপনি প্রতিটি শব্দের শব্দের এম্বেডিং পেয়ে গেলে, অন্যের সাথে মিল খুঁজে পাওয়ার জন্য আপনি প্রতিটি বাক্যে কোসাইন সাদৃশ্য ইত্যাদির মতো যেকোন মিলের মেট্রিকগুলি প্রয়োগ করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.