পাইথন: tf-idf-cosine: নথির মিল খুঁজে পেতে similar


94

আমি একটি টিউটোরিয়াল অনুসরণ করছিলাম যা পর্ব 1 এবং পার্ট 2 এ উপলব্ধ ছিল । দুর্ভাগ্যক্রমে লেখকের চূড়ান্ত বিভাগের জন্য সময় ছিল না যা আসলে দুটি নথির মধ্যে দূরত্ব খুঁজে পেতে কোসাইন অনুরূপ ব্যবহার করে জড়িত। আমি নিবন্ধের উদাহরণগুলি স্ট্যাকওভারফ্লো থেকে নিম্নলিখিত লিঙ্কটির সাহায্যে অনুসরণ করেছি , উপরের লিঙ্কে উল্লিখিত কোডটি অন্তর্ভুক্ত করা হয়েছে (কেবল জীবনকে সহজ করার জন্য)

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from nltk.corpus import stopwords
import numpy as np
import numpy.linalg as LA

train_set = ["The sky is blue.", "The sun is bright."]  # Documents
test_set = ["The sun in the sky is bright."]  # Query
stopWords = stopwords.words('english')

vectorizer = CountVectorizer(stop_words = stopWords)
#print vectorizer
transformer = TfidfTransformer()
#print transformer

trainVectorizerArray = vectorizer.fit_transform(train_set).toarray()
testVectorizerArray = vectorizer.transform(test_set).toarray()
print 'Fit Vectorizer to train set', trainVectorizerArray
print 'Transform Vectorizer to test set', testVectorizerArray

transformer.fit(trainVectorizerArray)
print
print transformer.transform(trainVectorizerArray).toarray()

transformer.fit(testVectorizerArray)
print 
tfidf = transformer.transform(testVectorizerArray)
print tfidf.todense()

উপরের কোডের ফলাফল হিসাবে আমার কাছে নিম্নলিখিত ম্যাট্রিক্স রয়েছে

Fit Vectorizer to train set [[1 0 1 0]
 [0 1 0 1]]
Transform Vectorizer to test set [[0 1 1 1]]

[[ 0.70710678  0.          0.70710678  0.        ]
 [ 0.          0.70710678  0.          0.70710678]]

[[ 0.          0.57735027  0.57735027  0.57735027]]

কোস্টিনের সাদৃশ্য গণনা করার জন্য এই আউটপুটটি কীভাবে ব্যবহার করবেন আমি নিশ্চিত নই, একই দৈর্ঘ্যের দুটি ভেক্টরের ক্ষেত্রে কোসাইন মিলকে কীভাবে প্রয়োগ করতে হবে তা আমি জানি তবে দুটি ভেক্টর কীভাবে সনাক্ত করতে হবে তা আমি নিশ্চিত নই।


4
ট্রেনভেক্টরাইজারআরে প্রতিটি ভেক্টরের জন্য, আপনাকে টেস্টভেক্টরাইজারআরে ভেক্টরের সাথে কোসাইন মিল খুঁজে পেতে হবে।

@ এক্সক্রয় ধন্যবাদ, আপনার সহায়ক পয়েন্টটি দিয়ে আমি এটি বের করে আনতে চাই, উত্তরটি দেওয়া উচিত?
অ্যাড-সেমি-কলোন

@ এক্সক্রয়ে তবে আমার কাছে ছোট প্রশ্ন আছে, বাস্তব আইডিএফ * আইডিএফ গণনার জন্য এর কোনও ব্যবহার নেই, কারণ আমি ম্যাট্রিক্সে দেখানো চূড়ান্ত ফলাফলগুলি ব্যবহার করছি না।
অ্যাড-সেমি-কলোন

4
এখানে টিউটোরিয়াল আপনি যে উদ্ধৃত 3 য় অংশ উত্তর বিবরণ আপনার প্রশ্ন হল pyevolve.sourceforge.net/wordpress/?p=2497
Clément Renaud

@ ক্ল্যামেন্টরেনড আমি আপনার সরবরাহিত লিঙ্কটি অনুসরণ করেছি তবে আমার নথিগুলি বড় হওয়ায় এটি মেমোরির ছুঁড়ে দেওয়া শুরু করে আমরা কীভাবে এটি পরিচালনা করতে পারি?
ashim888

উত্তর:


174

প্রথমে, আপনি যদি গণনা বৈশিষ্ট্যগুলি বের করতে এবং টিএফ-আইডিএফ নরমালাইজেশন এবং সারি-ভিত্তিক ইউক্লিডিয়ান নরমালাইজেশন প্রয়োগ করতে চান তবে আপনি একটি অপারেশনে এটি করতে পারেন TfidfVectorizer:

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> from sklearn.datasets import fetch_20newsgroups
>>> twenty = fetch_20newsgroups()

>>> tfidf = TfidfVectorizer().fit_transform(twenty.data)
>>> tfidf
<11314x130088 sparse matrix of type '<type 'numpy.float64'>'
    with 1787553 stored elements in Compressed Sparse Row format>

এখন একটি ডকুমেন্টের কোসাইন দূরত্ব (যেমন ডেটাসেটের প্রথমটি) এবং অন্য সকলের জন্য আপনাকে কেবল অন্য সকলের সাথে প্রথম ভেক্টরের ডট পণ্যগুলি গণনা করতে হবে কারণ টিফিডেফ ভেক্টরগুলি ইতিমধ্যে সারি-স্বাভাবিক করা হয়েছে।

যেমনটি ক্রিস ক্লার্কের মন্তব্যে ব্যাখ্যা করা হয়েছে এবং এখানে কোসিন সাদৃশ্য ভেক্টরগুলির পরিমাণকে বিবেচনা করে না। সারি-স্বাভাবিকীকরণের 1 এর परिमाण রয়েছে এবং তাই লিনিয়ার কার্নেলটি সাদৃশ্য মানগুলি গণনা করার জন্য যথেষ্ট।

স্কিপি স্পার্স ম্যাট্রিক্স এপিআইটি কিছুটা অদ্ভুত (ঘন এন-ডাইমেনশনাল নিম্পি অ্যারের মতো নমনীয় নয়)। প্রথম ভেক্টর পেতে আপনাকে একক সারিতে সাবম্যাট্রিক্স পেতে ম্যাট্রিক্স সারি অনুসারে টুকরো করতে হবে:

>>> tfidf[0:1]
<1x130088 sparse matrix of type '<type 'numpy.float64'>'
    with 89 stored elements in Compressed Sparse Row format>

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

>>> from sklearn.metrics.pairwise import linear_kernel
>>> cosine_similarities = linear_kernel(tfidf[0:1], tfidf).flatten()
>>> cosine_similarities
array([ 1.        ,  0.04405952,  0.11016969, ...,  0.04433602,
    0.04457106,  0.03293218])

সুতরাং শীর্ষে 5 সম্পর্কিত নথিগুলি খুঁজতে, আমরা ব্যবহার করতে পারি argsortএবং কিছু নেতিবাচক অ্যারে স্লাইসিং করতে পারি (বেশিরভাগ সম্পর্কিত নথিতে সর্বাধিক কোসাইন মিলের মান রয়েছে, সুতরাং সাজানো সূচকগুলির অ্যারের শেষে):

>>> related_docs_indices = cosine_similarities.argsort()[:-5:-1]
>>> related_docs_indices
array([    0,   958, 10576,  3277])
>>> cosine_similarities[related_docs_indices]
array([ 1.        ,  0.54967926,  0.32902194,  0.2825788 ])

প্রথম ফলাফলটি একটি স্যানিটি চেক: আমরা কোয়েরিনের অনুরূপ স্কোর 1 সহ সর্বাধিক অনুরূপ নথি হিসাবে ক্যোরি ডকুমেন্টটি পাই যা নিম্নলিখিত পাঠ্য রয়েছে:

>>> print twenty.data[0]
From: lerxst@wam.umd.edu (where's my thing)
Subject: WHAT car is this!?
Nntp-Posting-Host: rac3.wam.umd.edu
Organization: University of Maryland, College Park
Lines: 15

 I was wondering if anyone out there could enlighten me on this car I saw
the other day. It was a 2-door sports car, looked to be from the late 60s/
early 70s. It was called a Bricklin. The doors were really small. In addition,
the front bumper was separate from the rest of the body. This is
all I know. If anyone can tellme a model name, engine specs, years
of production, where this car is made, history, or whatever info you
have on this funky looking car, please e-mail.

Thanks,
- IL
   ---- brought to you by your neighborhood Lerxst ----

দ্বিতীয় সর্বাধিক অনুরূপ নথির একটি উত্তর যা মূল বার্তাকে উদ্ধৃত করে তাই অনেকগুলি সাধারণ শব্দ রয়েছে:

>>> print twenty.data[958]
From: rseymour@reed.edu (Robert Seymour)
Subject: Re: WHAT car is this!?
Article-I.D.: reed.1993Apr21.032905.29286
Reply-To: rseymour@reed.edu
Organization: Reed College, Portland, OR
Lines: 26

In article <1993Apr20.174246.14375@wam.umd.edu> lerxst@wam.umd.edu (where's my
thing) writes:
>
>  I was wondering if anyone out there could enlighten me on this car I saw
> the other day. It was a 2-door sports car, looked to be from the late 60s/
> early 70s. It was called a Bricklin. The doors were really small. In
addition,
> the front bumper was separate from the rest of the body. This is
> all I know. If anyone can tellme a model name, engine specs, years
> of production, where this car is made, history, or whatever info you
> have on this funky looking car, please e-mail.

Bricklins were manufactured in the 70s with engines from Ford. They are rather
odd looking with the encased front bumper. There aren't a lot of them around,
but Hemmings (Motor News) ususally has ten or so listed. Basically, they are a
performance Ford with new styling slapped on top.

>    ---- brought to you by your neighborhood Lerxst ----

Rush fan?

--
Robert Seymour              rseymour@reed.edu
Physics and Philosophy, Reed College    (NeXTmail accepted)
Artificial Life Project         Reed College
Reed Solar Energy Project (SolTrain)    Portland, OR

একটি ফলোআপ প্রশ্ন: আমার কাছে যদি খুব বড় সংখ্যক নথি থাকে তবে দ্বিতীয় ধাপে লিনিয়ার_কার্নেল কার্য সম্পাদন বাধা হতে পারে, কারণ এটি সারি সংখ্যার সাথে লিনিয়ার line এটিকে সাবলাইনারে কীভাবে হ্রাস করবেন তার কোনও চিন্তা?
শুয়ো

আপনি ইলাস্টিক অনুসন্ধান এবং সোলারের "আরও বেশি এই জাতীয়" কোয়েরিগুলি ব্যবহার করতে পারেন যা উপ-লিনিয়ার স্কেলাবিলিটি প্রোফাইলের সাথে আনুমানিক উত্তর পাওয়া উচিত।
ogrisel

7
এই আপনি প্রত্যেক অন্যান্য দলিল সঙ্গে প্রতিটি নথির কোসাইন আদল দিতে হবে, পরিবর্তে শুধুমাত্র প্রথম এক: cosine_similarities = linear_kernel(tfidf, tfidf)?
ionox0

4
হ্যাঁ, এটি আপনাকে জোড়াযুক্ত মিলগুলির একটি বর্গ ম্যাট্রিক্স দেবে।
ogrisel

10
যদি অন্যরাও আমার মতো করে ভাবছিল তবে এই ক্ষেত্রে লিনিয়ার_কার্নেলটি কোসাইন_সাম্যতার সমতুল্য কারণ টিফিডফেক্টরাইজারটি সাধারণ ভেক্টর তৈরি করে। দস্তাবেজে নোটটি দেখুন: scikit-learn.org/stable/modules/metrics.html#cosine-siversity
ক্রিস ক্লার্ক

22

@ এক্স্রেয়ের মন্তব্যের সাহায্যে, আমি এটার উত্তরটি বের করে আনলাম, ট্রেনের ডেটা এবং পরীক্ষার ডেটা উপস্থাপনকারী দুটি অ্যারেতে লুপের জন্য পুনরায় পুনরুক্তি করতে আমাদের যা করা দরকার তা আসলে write

প্রথমে কোসাইন গণনার সূত্র ধরে রাখতে একটি সাধারণ ল্যাম্বডা ফাংশন প্রয়োগ করুন:

cosine_function = lambda a, b : round(np.inner(a, b)/(LA.norm(a)*LA.norm(b)), 3)

এবং তারপরে কেবল ভেক্টরটিতে পুনরাবৃত্তি করার জন্য লুপের জন্য একটি সহজ লিখুন, যুক্তিটি প্রতিটি "ট্রেনভেক্টরাইজারআরে প্রতিটি ভেক্টরের জন্য, আপনাকে টেস্টভেক্টরাইজারে ভেক্টরের সাথে কোসাইন মিল খুঁজে পেতে হবে।"

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from nltk.corpus import stopwords
import numpy as np
import numpy.linalg as LA

train_set = ["The sky is blue.", "The sun is bright."] #Documents
test_set = ["The sun in the sky is bright."] #Query
stopWords = stopwords.words('english')

vectorizer = CountVectorizer(stop_words = stopWords)
#print vectorizer
transformer = TfidfTransformer()
#print transformer

trainVectorizerArray = vectorizer.fit_transform(train_set).toarray()
testVectorizerArray = vectorizer.transform(test_set).toarray()
print 'Fit Vectorizer to train set', trainVectorizerArray
print 'Transform Vectorizer to test set', testVectorizerArray
cx = lambda a, b : round(np.inner(a, b)/(LA.norm(a)*LA.norm(b)), 3)

for vector in trainVectorizerArray:
    print vector
    for testV in testVectorizerArray:
        print testV
        cosine = cx(vector, testV)
        print cosine

transformer.fit(trainVectorizerArray)
print
print transformer.transform(trainVectorizerArray).toarray()

transformer.fit(testVectorizerArray)
print 
tfidf = transformer.transform(testVectorizerArray)
print tfidf.todense()

এখানে ফলাফল:

Fit Vectorizer to train set [[1 0 1 0]
 [0 1 0 1]]
Transform Vectorizer to test set [[0 1 1 1]]
[1 0 1 0]
[0 1 1 1]
0.408
[0 1 0 1]
[0 1 1 1]
0.816

[[ 0.70710678  0.          0.70710678  0.        ]
 [ 0.          0.70710678  0.          0.70710678]]

[[ 0.          0.57735027  0.57735027  0.57735027]]

4
সুন্দর..আমিও প্রথম থেকেই শিখছি এবং আপনার প্রশ্নোত্তর অনুসরণ করা সবচেয়ে সহজ। আমি মনে করি আপনি নিজের রোল-আপনার নিজস্ব পদ্ধতিটি পরিবর্তে np.corrcoef () ব্যবহার করতে পারেন।
wbg

transformer.fitঅপারেশনগুলির উদ্দেশ্য কী এবং tfidf.todense()? আপনি লুপ থেকে আপনার মিলের মানগুলি পেয়েছেন এবং তারপরে টিফিডএফ চালিয়ে যেতে চান? আপনার গণিত কোসাইন মানটি কোথায় ব্যবহৃত হয়? আপনার উদাহরণ বিভ্রান্তিকর।
খনিজগুলি

আপনার বোঝাতে কিছু মনে না হলে কোসাইন ঠিক কী ফিরে আসছেন। আপনার উদাহরণে আপনি পেয়েছেন 0.408এবং 0.816, এই মানগুলি কী?
বায়দাদিপ

20

আমি এটি একটি পুরানো পোস্ট জানি। তবে আমি http://scikit-learn.sourceforge.net/stable/ প্যাকেজটি চেষ্টা করেছি । কোসাইন মিল খুঁজে পেতে আমার কোড এখানে। প্রশ্নটি ছিল আপনি কীভাবে এই প্যাকেজটির সাথে কোসাইন মিলকে গণনা করবেন এবং তার জন্য এখানে আমার কোড is

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer

f = open("/root/Myfolder/scoringDocuments/doc1")
doc1 = str.decode(f.read(), "UTF-8", "ignore")
f = open("/root/Myfolder/scoringDocuments/doc2")
doc2 = str.decode(f.read(), "UTF-8", "ignore")
f = open("/root/Myfolder/scoringDocuments/doc3")
doc3 = str.decode(f.read(), "UTF-8", "ignore")

train_set = ["president of India",doc1, doc2, doc3]

tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix_train = tfidf_vectorizer.fit_transform(train_set)  #finds the tfidf score with normalization
print "cosine scores ==> ",cosine_similarity(tfidf_matrix_train[0:1], tfidf_matrix_train)  #here the first element of tfidf_matrix_train is matched with other three elements

এখানে ধরুন কোয়েরিটি ট্রেন_সেটের প্রথম উপাদান এবং ডক 1, ডক 2 এবং ডক 3 হ'ল নথি যা আমি কোসাইন মিলের সাহায্যে র‌্যাঙ্ক করতে চাই। তাহলে আমি এই কোডটি ব্যবহার করতে পারি।

এছাড়াও প্রশ্নে প্রদত্ত টিউটোরিয়ালগুলি খুব দরকারী ছিল। এখানে অংশ- I , খণ্ড-II , খণ্ড-III এর সমস্ত অংশ রয়েছে

ফলাফল নিম্নরূপ হবে:

[[ 1.          0.07102631  0.02731343  0.06348799]]

এখানে 1 প্রতিনিধিত্ব করে যে ক্যোয়ারীটি নিজের সাথে মিলেছে এবং অন্য তিনটি সম্পর্কিত ডকুমেন্টগুলির সাথে ক্যোয়ারির সাথে মেলে স্কোর।


4
কোসাইন_সাম্যতা (tfidf_matrix_train [0: 1], tfidf_matrix_train) যদি 1 টি হাজার হাজারেরও বেশি হয়ে যায় তবে কী হবে? সেটা আমরা কীভাবে পরিচালনা করতে পারি ??
ashim888

4
কীভাবে পরিচালনা করবেনValueError: Incompatible dimension for X and Y matrices: X.shape[1] == 1664 while Y.shape[1] == 2
পিড

17

আমার লেখা আরেকটি টিউটোরিয়াল আপনাদের দিই। এটি আপনার প্রশ্নের উত্তর দেয়, তবে আমরা কেন কিছু জিনিস করছি তা ব্যাখ্যা করে। আমি এটাকে সংক্ষিপ্ত করার চেষ্টাও করেছি।

সুতরাং আপনার একটি আছে list_of_documentsযা কেবল স্ট্রিংগুলির একটি অ্যারে এবং অন্যটি documentযা কেবল একটি স্ট্রিং। list_of_documentsআপনার সর্বাধিক অনুরূপ থেকে এই জাতীয় দস্তাবেজটি সন্ধান করতে হবে document

আসুন তাদের একত্রিত করুন: documents = list_of_documents + [document]

নির্ভরতা দিয়ে শুরু করা যাক। আমরা তাদের প্রত্যেকটি কেন ব্যবহার করব তা পরিষ্কার হয়ে যাবে।

from nltk.corpus import stopwords
import string
from nltk.tokenize import wordpunct_tokenize as tokenize
from nltk.stem.porter import PorterStemmer
from sklearn.feature_extraction.text import TfidfVectorizer
from scipy.spatial.distance import cosine

যে পদ্ধতির ব্যবহার হতে পারে তার মধ্যে একটি হ'ল ব্যাগ-অফ-শব্দের পন্থা, যেখানে আমরা ডকুমেন্টের প্রতিটি শব্দের সাথে অন্যদের থেকে পৃথক আচরণ করি এবং কেবল সেগুলি সমস্তকে বড় ব্যাগে একসাথে নিক্ষেপ করি। এক দৃষ্টিকোণ থেকে এটি প্রচুর তথ্য হারিয়ে ফেলে (যেমন শব্দগুলি কীভাবে সংযুক্ত হয়) তবে অন্য দৃষ্টিকোণ থেকে এটি মডেলটিকে সহজ করে তোলে।

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

porter = PorterStemmer()
stop_words = set(stopwords.words('english'))

modified_arr = [[porter.stem(i.lower()) for i in tokenize(d.translate(None, string.punctuation)) if i.lower() not in stop_words] for d in documents]

তাহলে শব্দের এই ব্যাগটি কীভাবে আমাদের সহায়তা করবে? কল্পনা করুন আমরা 3 ব্যাগ আছে: [a, b, c], [a, c, a]এবং [b, c, d]। আমরা তাদের ভিত্তিতে ভেক্টরে রূপান্তর করতে পারি [a, b, c, d]। সুতরাং আমরা ভেক্টর দিয়ে শেষ: [1, 1, 1, 0], [2, 0, 1, 0]এবং [0, 1, 1, 1]। অনুরূপ জিনিসটি আমাদের নথিগুলির সাথে রয়েছে (কেবলমাত্র ভেক্টরগুলি দীর্ঘতর হবে)। এখন আমরা দেখতে পাচ্ছি যে আমরা প্রচুর শব্দ মুছে ফেলেছি এবং অন্যগুলিকেও ভেক্টরগুলির মাত্রা হ্রাস করতে কমেছি। এখানে কেবল আকর্ষণীয় পর্যবেক্ষণ আছে। লম্বা নথিতে সংক্ষিপ্ত চেয়ে তুলনামূলকভাবে আরও ইতিবাচক উপাদান থাকবে, এ কারণেই ভেক্টরটিকে স্বাভাবিক করা ভাল। একে টার্ম ফ্রিকোয়েন্সি টিএফ বলা হয়, লোকেরা অন্যান্য নথিগুলিতে শব্দটি প্রায়শই কতবার ব্যবহৃত হয় সে সম্পর্কে অতিরিক্ত তথ্যও ব্যবহার করে - বিপরীত দলিল ফ্রিকোয়েন্সি আইডিএফ। একসাথে আমাদের একটি মেট্রিক টিএফ-আইডিএফ রয়েছে যাতে বেশ কয়েকটি স্বাদ রয়েছে। এটি স্কেলের্নে এক লাইনের সাথে অর্জন করা যেতে পারে :-)

modified_doc = [' '.join(i) for i in modified_arr] # this is only to convert our list of lists to list of strings that vectorizer uses.
tf_idf = TfidfVectorizer().fit_transform(modified_doc)

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

সুতরাং আমরা সমস্ত ভেক্টর গণনা করা আছে। শেষ পদক্ষেপটি হ'ল কোনটির সাথে সর্বশেষের সাথে সাদৃশ্য রয়েছে। এটি অর্জনের বিভিন্ন উপায় রয়েছে যার মধ্যে একটি হ'ল ইউক্লিডিয়ান দূরত্ব যা এখানে আলোচিত কারণে এতটা দুর্দান্ত নয় । আরেকটি পদ্ধতির মধ্যে কোসাইন মিল রয়েছে । আমরা সমস্ত দস্তাবেজ পুনরুক্তি করি এবং নথি এবং শেষটির মধ্যে কোসাইন মিলকে গণনা করছি:

l = len(documents) - 1
for i in xrange(l):
    minimum = (1, None)
    minimum = min((cosine(tf_idf[i].todense(), tf_idf[l + 1].todense()), i), minimum)
print minimum

এখন সর্বনিম্ন সেরা দস্তাবেজ এবং এর স্কোর সম্পর্কে তথ্য থাকবে।


4
সাইন ইন, এটি অপটিটি যা চেয়েছিল তা নয়: সেরা ডক প্রদত্ত ক্যোয়ারী অনুসন্ধান করা হচ্ছে কোনও কর্পাসের "সেরা নথি" নয়। দয়া করে এটি করবেন না, আমার মতো পিপিএল অপ্ট টাস্কের জন্য আপনার উদাহরণ ব্যবহার করার চেষ্টা করার সময় নষ্ট করবে এবং ম্যাট্রিক্সের আকার পরিবর্তনকারী পাগলামিতে টেনে নিয়ে যাবে।
খনিজগুলি

এবং এটি কীভাবে আলাদা? ধারণা সম্পূর্ণরূপে এক। বৈশিষ্ট্যগুলি নিষ্কাশন করুন, একটি ক্যোয়ারী এবং নথিগুলির মধ্যে কোসাইন দূরত্ব গণনা করুন।
সালভাদোর ডালি

আপনি এটি সমান আকারের ম্যাট্রিকগুলিতে গণনা করছেন, একটি আলাদা উদাহরণ চেষ্টা করুন, যেখানে আপনার কাছে একটি কোয়েরি ম্যাট্রিক্স রয়েছে যা বিভিন্ন আকারের, অপের ট্রেনের সেট এবং পরীক্ষার সেট। আমি আপনার কোডটি পরিবর্তন করতে পারিনি যাতে এটি কাজ করে।
খনিজগুলি 21

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

12

এটি আপনার সাহায্য করা উচিত।

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity  

tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(train_set)
print tfidf_matrix
cosine = cosine_similarity(tfidf_matrix[length-1], tfidf_matrix)
print cosine

এবং আউটপুট হবে:

[[ 0.34949812  0.81649658  1.        ]]

9
আপনি দৈর্ঘ্য কিভাবে পেতে?
গোগাসকা

3

এখানে এমন একটি ফাংশন যা প্রশিক্ষণের ডেটার সাথে টিএফ-আইডিএফ ট্রান্সফর্মার লাগিয়ে প্রশিক্ষণের ডেটার সাথে আপনার পরীক্ষার ডেটা তুলনা করে। সুবিধা হ'ল আপনি নিকটতম উপাদানগুলি অনুসন্ধান করার জন্য দ্রুত পিভট বা গোষ্ঠী তৈরি করতে পারেন এবং গণনাগুলি ম্যাট্রিক্স অনুসারে কম are

def create_tokenizer_score(new_series, train_series, tokenizer):
    """
    return the tf idf score of each possible pairs of documents
    Args:
        new_series (pd.Series): new data (To compare against train data)
        train_series (pd.Series): train data (To fit the tf-idf transformer)
    Returns:
        pd.DataFrame
    """

    train_tfidf = tokenizer.fit_transform(train_series)
    new_tfidf = tokenizer.transform(new_series)
    X = pd.DataFrame(cosine_similarity(new_tfidf, train_tfidf), columns=train_series.index)
    X['ix_new'] = new_series.index
    score = pd.melt(
        X,
        id_vars='ix_new',
        var_name='ix_train',
        value_name='score'
    )
    return score

train_set = pd.Series(["The sky is blue.", "The sun is bright."])
test_set = pd.Series(["The sun in the sky is bright."])
tokenizer = TfidfVectorizer() # initiate here your own tokenizer (TfidfVectorizer, CountVectorizer, with stopwords...)
score = create_tokenizer_score(train_series=train_set, new_series=test_set, tokenizer=tokenizer)
score

   ix_new   ix_train    score
0   0       0       0.617034
1   0       1       0.862012


সূচকের জন্য এনপি.আরঞ্জ (0, লেন (স্কোর)): মান = স্কোর.লোক [সূচক, 'স্কোর']
গোল্ডেন লায়ন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.