আমি কোনও এনএলপি প্রকল্পে কাজ করার দিকে তাকিয়ে আছি, যে কোনও প্রোগ্রামিং ভাষায় (যদিও পাইথন আমার পছন্দ হবে)।
আমি দুটি নথি নিতে এবং সেগুলির অনুরূপ নির্ধারণ করতে চাই।
আমি কোনও এনএলপি প্রকল্পে কাজ করার দিকে তাকিয়ে আছি, যে কোনও প্রোগ্রামিং ভাষায় (যদিও পাইথন আমার পছন্দ হবে)।
আমি দুটি নথি নিতে এবং সেগুলির অনুরূপ নির্ধারণ করতে চাই।
উত্তর:
এটি করার সাধারণ উপায় হ'ল ডকুমেন্টগুলিকে টিএফ-আইডিএফ ভেক্টরগুলিতে রূপান্তর করা এবং তারপরে তাদের মধ্যে কোসাইন মিলকে গণনা করা। তথ্য পুনরুদ্ধারের উপর কোনও পাঠ্যপুস্তক এটি অন্তর্ভুক্ত। এসএসপি দেখুন। তথ্য পুনরুদ্ধারের পরিচিতি , যা বিনামূল্যে এবং অনলাইনে উপলব্ধ।
টিএফ-আইডিএফ (এবং অনুরূপ পাঠ্য রূপান্তর) পাইথন প্যাকেজগুলি জেনসিম এবং সাইকিট- শিখায় প্রয়োগ করা হয় । পরবর্তী প্যাকেজে, কম্পিউটিং কোসাইন মিলগুলি তত সহজ
from sklearn.feature_extraction.text import TfidfVectorizer
documents = [open(f) for f in text_files]
tfidf = TfidfVectorizer().fit_transform(documents)
# no need to normalize, since Vectorizer will return normalized tf-idf
pairwise_similarity = tfidf * tfidf.T
বা, যদি দস্তাবেজগুলি সরল স্ট্রিং হয়,
>>> corpus = ["I'd like an apple",
... "An apple a day keeps the doctor away",
... "Never compare an apple to an orange",
... "I prefer scikit-learn to Orange",
... "The scikit-learn docs are Orange and Blue"]
>>> vect = TfidfVectorizer(min_df=1, stop_words="english")
>>> tfidf = vect.fit_transform(corpus)
>>> pairwise_similarity = tfidf * tfidf.T
যদিও Gensim এ ধরণের কাজের জন্য আরও বিকল্প থাকতে পারে।
আরও দেখুন এই প্রশ্নের ।
[অস্বীকৃতি: আমি সাইকিট-লার্ন টিএফ-আইডিএফ বাস্তবায়নের সাথে জড়িত ছিলাম।]
উপরের দিক থেকে, pairwise_similarity
একটি স্কিপি স্পার্স ম্যাট্রিক্স যা আকারে বর্গক্ষেত্রযুক্ত, সারি এবং কলামগুলির সংখ্যার সাথে কর্পাসের নথির সংখ্যার সমান।
>>> pairwise_similarity
<5x5 sparse matrix of type '<class 'numpy.float64'>'
with 17 stored elements in Compressed Sparse Row format>
আপনি এর মাধ্যমে একটি NumPy অ্যারেতে বিক্ষিপ্ত অ্যারের রূপান্তর করতে পারেন .toarray()
বা .A
:
>>> pairwise_similarity.toarray()
array([[1. , 0.17668795, 0.27056873, 0. , 0. ],
[0.17668795, 1. , 0.15439436, 0. , 0. ],
[0.27056873, 0.15439436, 1. , 0.19635649, 0.16815247],
[0. , 0. , 0.19635649, 1. , 0.54499756],
[0. , 0. , 0.16815247, 0.54499756, 1. ]])
ধরা যাক আমরা চূড়ান্ত নথির সাথে ডকুমেন্টটি সর্বাধিক অনুরূপ খুঁজতে চাই, "সাইকিট-শেখা ডকসটি কমলা এবং নীল"। এই নথিতে ইনডেক্স 4 রয়েছে corpus
। আপনি এই সারিটির আরগম্যাক্স নিয়ে সর্বাধিক অনুরূপ নথির সূচি খুঁজে পেতে পারেন , তবে প্রথমে আপনাকে 1 এর মুখোশ তৈরি করতে হবে, যা প্রতিটি নথির নিজের মধ্যে মিলের প্রতিনিধিত্ব করে । আপনি এর মাধ্যমে np.fill_diagonal()
এবং পরবর্তীটি এর মাধ্যমে করতে পারেন np.nanargmax()
:
>>> import numpy as np
>>> arr = pairwise_similarity.toarray()
>>> np.fill_diagonal(arr, np.nan)
>>> input_doc = "The scikit-learn docs are Orange and Blue"
>>> input_idx = corpus.index(input_doc)
>>> input_idx
4
>>> result_idx = np.nanargmax(arr[input_idx])
>>> corpus[result_idx]
'I prefer scikit-learn to Orange'
দ্রষ্টব্য: একটি বিচ্ছিন্ন ম্যাট্রিক্স ব্যবহারের উদ্দেশ্যটি একটি বৃহত কর্পাস এবং শব্দভাণ্ডারের জন্য (প্রচুর পরিমাণে স্থান) সংরক্ষণ করা। একটি NumPy অ্যারে রূপান্তর পরিবর্তে, আপনি এটি করতে পারেন:
>>> n, _ = pairwise_similarity.shape
>>> pairwise_similarity[np.arange(n), np.arange(n)] = -1.0
>>> pairwise_similarity[input_idx].argmax()
3
X.mean(axis=0)
, তারপরে গড় / সর্বোচ্চ / মিডিয়ান (∗) ইউক্লিডিয়ান দূরত্ব গণনা করুন। (∗) আপনার অভিনব যা আছে তা চয়ন করুন।
@ এলারসম্যানের কাছে পরিচিত, তবে কিছুটা প্রাকপ্রসেসিংয়ের সাথে
import nltk, string
from sklearn.feature_extraction.text import TfidfVectorizer
nltk.download('punkt') # if necessary...
stemmer = nltk.stem.porter.PorterStemmer()
remove_punctuation_map = dict((ord(char), None) for char in string.punctuation)
def stem_tokens(tokens):
return [stemmer.stem(item) for item in tokens]
'''remove punctuation, lowercase, stem'''
def normalize(text):
return stem_tokens(nltk.word_tokenize(text.lower().translate(remove_punctuation_map)))
vectorizer = TfidfVectorizer(tokenizer=normalize, stop_words='english')
def cosine_sim(text1, text2):
tfidf = vectorizer.fit_transform([text1, text2])
return ((tfidf * tfidf.T).A)[0,1]
print cosine_sim('a little bird', 'a little bird')
print cosine_sim('a little bird', 'a little bird chirps')
print cosine_sim('a little bird', 'a big dog barks')
fit
এবং কোনটি transform
?
এটি একটি পুরানো প্রশ্ন, তবে আমি পেয়েছি স্প্যাসির সাহায্যে এটি সহজেই করা যায় । দস্তাবেজটি একবার পড়া হয়ে গেলে, similarity
ডকুমেন্ট ভেক্টরগুলির মধ্যে কোজিনের মিল খুঁজে পেতে একটি সাধারণ এপিআই ব্যবহার করা যেতে পারে।
import spacy
nlp = spacy.load('en')
doc1 = nlp(u'Hello hi there!')
doc2 = nlp(u'Hello hi there!')
doc3 = nlp(u'Hey whatsup?')
print doc1.similarity(doc2) # 0.999999954642
print doc2.similarity(doc3) # 0.699032527716
print doc1.similarity(doc3) # 0.699032527716
সাধারণত দুটি ডকুমেন্টের মধ্যে একটি কোসাইন সাদৃশ্য নথির মিল হিসাবে পরিমাপ করা হয়। জাভা, আপনি ব্যবহার করতে পারেন Lucene (আপনার সংগ্রহে চমত্কার বৃহৎ হলে) অথবা LingPipe এই কাজ করতে। মূল ধারণাটি হ'ল প্রতিটি নথিতে শর্তগুলি গণনা করা এবং ভেক্টর পদটির বিন্দু পণ্য গণনা করা। লাইব্রেরিগুলি এই সাধারণ পদ্ধতির উপর বেশ কয়েকটি উন্নতি করে, যেমন বিপরীতমুখী নথির ফ্রিকোয়েন্সি ব্যবহার করে এবং tf-idf ভেক্টর গণনা করে। যদি আপনি কোপম্লেক্স কিছু করতে চান তবে লিংপাইপ নথিগুলির মধ্যে এলএসএর মিল খুঁজে বের করার পদ্ধতিও সরবরাহ করে যা কোসাইন মিলের চেয়ে ভাল ফলাফল দেয়। পাইথনের জন্য, আপনি এনএলটিকে ব্যবহার করতে পারেন ।
আপনি যদি খুব নির্ভুল কিছু খুঁজছেন তবে আপনাকে টিএফ-আইডিএফের চেয়ে আরও ভাল সরঞ্জাম ব্যবহার করা উচিত। যে কোনও দুটি টুকরো পাঠের মধ্যে সাদৃশ্য খুঁজে পেতে সর্বজনগ্রাহ্য বাক্য এনকোডার অন্যতম নির্ভুল accurate গুগল প্রাক-প্রশিক্ষিত মডেলগুলি সরবরাহ করেছে যা আপনি কোনও আঁচড় থেকে কোনও প্রশিক্ষণের প্রয়োজন ছাড়াই আপনার নিজের প্রয়োগের জন্য ব্যবহার করতে পারেন। প্রথমত, আপনাকে টেনসরফ্লো এবং টেনসরফ্লো হাব ইনস্টল করতে হবে:
pip install tensorflow
pip install tensorflow_hub
নীচের কোডটি আপনাকে কোনও পাঠ্যকে একটি নির্দিষ্ট দৈর্ঘ্যের ভেক্টর উপস্থাপনায় রূপান্তর করতে দেয় এবং তারপরে আপনি ডট পণ্যটি ব্যবহার করতে পারেন তাদের মধ্যে মিল খুঁজে বের করতে
import tensorflow_hub as hub
module_url = "https://tfhub.dev/google/universal-sentence-encoder/1?tf-hub-format=compressed"
# Import the Universal Sentence Encoder's TF Hub module
embed = hub.Module(module_url)
# sample text
messages = [
# Smartphones
"My phone is not good.",
"Your cellphone looks great.",
# Weather
"Will it snow tomorrow?",
"Recently a lot of hurricanes have hit the US",
# Food and health
"An apple a day, keeps the doctors away",
"Eating strawberries is healthy",
]
similarity_input_placeholder = tf.placeholder(tf.string, shape=(None))
similarity_message_encodings = embed(similarity_input_placeholder)
with tf.Session() as session:
session.run(tf.global_variables_initializer())
session.run(tf.tables_initializer())
message_embeddings_ = session.run(similarity_message_encodings, feed_dict={similarity_input_placeholder: messages})
corr = np.inner(message_embeddings_, message_embeddings_)
print(corr)
heatmap(messages, messages, corr)
এবং ষড়যন্ত্রের কোড:
def heatmap(x_labels, y_labels, values):
fig, ax = plt.subplots()
im = ax.imshow(values)
# We want to show all ticks...
ax.set_xticks(np.arange(len(x_labels)))
ax.set_yticks(np.arange(len(y_labels)))
# ... and label them with the respective list entries
ax.set_xticklabels(x_labels)
ax.set_yticklabels(y_labels)
# Rotate the tick labels and set their alignment.
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", fontsize=10,
rotation_mode="anchor")
# Loop over data dimensions and create text annotations.
for i in range(len(y_labels)):
for j in range(len(x_labels)):
text = ax.text(j, i, "%.2f"%values[i, j],
ha="center", va="center", color="w",
fontsize=6)
fig.tight_layout()
plt.show()
আপনি দেখতে পাচ্ছেন যে সর্বাধিক সাদৃশ্যটি তাদের সাথে পাঠ্যগুলির মধ্যে এবং তারপরে অর্থের সাথে তাদের নিকটবর্তী পাঠগুলির মধ্যে।
গুরুত্বপূর্ণ : আপনি প্রথমবার কোডটি চালাবেন এটি ধীর হবে কারণ এটির মডেলটি ডাউনলোড করা দরকার। আপনি যদি আবার এটি মডেল ডাউনলোড করতে বাধা এবং স্থানীয় মডেলটি ব্যবহার করতে চান তবে আপনাকে ক্যাশের জন্য একটি ফোল্ডার তৈরি করতে হবে এবং এটি পরিবেশের পরিবর্তনশীলতে যুক্ত করতে হবে এবং তারপরে প্রথমবার চলার পরে সেই পথটি ব্যবহার করুন:
tf_hub_cache_dir = "universal_encoder_cached/"
os.environ["TFHUB_CACHE_DIR"] = tf_hub_cache_dir
# pointing to the folder inside cache dir, it will be unique on your system
module_url = tf_hub_cache_dir+"/d8fbeb5c580e50f975ef73e80bebba9654228449/"
embed = hub.Module(module_url)
আরও তথ্য: https://tfhub.dev/google/universal-senferences-encoder/2
আপনাকে শুরু করার জন্য এখানে একটি ছোট্ট অ্যাপ ...
import difflib as dl
a = file('file').read()
b = file('file1').read()
sim = dl.get_close_matches
s = 0
wa = a.split()
wb = b.split()
for i in wa:
if sim(i, wb):
s += 1
n = float(s) / float(len(wa))
print '%d%% similarity' % int(n * 100)
আপনি কোসাইন ডকুমেন্ট আদল এই অনলাইন পরিষেবা চেষ্টা করতে পারেন http://www.scurtu.it/documentSimilarity.html
import urllib,urllib2
import json
API_URL="http://www.scurtu.it/apis/documentSimilarity"
inputDict={}
inputDict['doc1']='Document with some text'
inputDict['doc2']='Other document with some text'
params = urllib.urlencode(inputDict)
f = urllib2.urlopen(API_URL, params)
response= f.read()
responseObject=json.loads(response)
print responseObject
আপনি যদি টুকরো টুকরো টুকরো শব্দার্থক সাদৃশ্যটি পরিমাপ করতে আরও আগ্রহী হন তবে আমি এই গিটল্যাব প্রকল্পটি একবার দেখে নিন । আপনি এটি সার্ভার হিসাবে চালাতে পারেন, এখানে একটি প্রাক-বিল্ট মডেলও রয়েছে যা আপনি টুকরো টুকরো টুকরোটির মিল খুঁজে নিতে সহজেই ব্যবহার করতে পারেন; যদিও এটি বেশিরভাগ ক্ষেত্রে দুটি বাক্যের মিল খুঁজে পাওয়ার জন্য প্রশিক্ষণপ্রাপ্ত, আপনি এখনও এটি আপনার ক্ষেত্রে ব্যবহার করতে পারেন t এটি জাভাতে লেখা আছে তবে আপনি এটি একটি বিশ্রাম পরিষেবা হিসাবে চালাতে পারেন।
আর একটি অপশন হ'ল ডি কেপ্রো সিম্যারিটি যা পাঠ্যের মিলকে মাপতে বিভিন্ন অ্যালগরিদম সহ একটি গ্রন্থাগার। তবে এটি জাভাতেও লেখা আছে।
কোড উদাহরণ:
// this similarity measure is defined in the dkpro.similarity.algorithms.lexical-asl package
// you need to add that to your .pom to make that example work
// there are some examples that should work out of the box in dkpro.similarity.example-gpl
TextSimilarityMeasure measure = new WordNGramJaccardMeasure(3); // Use word trigrams
String[] tokens1 = "This is a short example text .".split(" ");
String[] tokens2 = "A short example text could look like that .".split(" ");
double score = measure.getSimilarity(tokens1, tokens2);
System.out.println("Similarity: " + score);
খুব কম ডেটাসেটের সাথে বাক্যটির মিল খুঁজে পেতে এবং উচ্চ নির্ভুলতা পেতে আপনি পাইথন প্যাকেজের নীচে ব্যবহার করতে পারেন যা প্রাক প্রশিক্ষিত বিআরটি মডেলগুলি ব্যবহার করছে,
pip install similar-sentences
সিনট্যাকটিক সাদৃশ্যটির জন্য সাদৃশ্য সনাক্তকরণের 3 সহজ উপায় হতে পারে।
সিম্যান্টিক সাদৃশ্যটির জন্য কেউ বের্ট এম্বেডিং ব্যবহার করতে পারেন এবং ডকুমেন্ট এম্বেডিং পেতে আলাদা শব্দের পুলিং কৌশল চেষ্টা করতে পারেন এবং তারপরে নথি এম্বেডিংয়ে কোসাইন মিলটি প্রয়োগ করতে পারেন।
একটি উন্নত পদ্ধতিটি মিল খুঁজে পেতে বার্ট স্কোর ব্যবহার করতে পারে।
গবেষণামূলক কাগজের লিঙ্ক: https://arxiv.org/abs/1904.09675