এটি বায়াসের উপপাদ্যের উপর ভিত্তি করে একটি সাধারণ শ্রেণিবিন্যাস পদ্ধতি। এটি ইনপুট টেক্সটের খুব সাধারণ বৈশিস্টের
উপর নির্ভর করে যা Bag of Words নামে পরিচিত ।
বয়েস তত্ত্বটি সম্ভাবনা P(c|x) গণনা করে যেখানে ,
c - সম্ভাব্য ফলাফলের শ্রেণি এবং
x - হল প্রদত্ত উদাহরণ যা শ্রেণিবদ্ধ করতে হবে, কিছু নির্দিষ্ট বৈশিষ্ট্য উপস্থাপন করে।
P(c|x) = P(x|c) * P(c) / P(x)
নাইভ বায়াস বেশিরভাগ ক্ষেত্রে নেচারাল ল্যাঙ্গুয়েজ প্রসেসিং (এনএলপি) এর বিভিন্ন সমস্যার সমাধানের ক্ষেত্রে ব্যবহৃত হয়। নাইভ বায়াস একটি ইনপুট তেক্সটের ট্যাগের সম্ভাবনা বএল দেয়। তারা ইনপুট টেক্সটের জন্য প্রতিটি ট্যাগের সম্ভাবনা গণনা করে এবং তারপরে সর্বোচ্চটি দিয়ে ট্যাগ আউটপুট দেয়।
আসুন একটি উদাহরণ দিয়ে বোঝা যাক, ইনপুট টেক্সটটি পজিটিভ না নেগেটিভ অর্থ বোঝায় তা বের করি।
ট্রেনিং ডেটাসেট:
"overall liked the movie " এই ইনপুট টেক্সট টি পজিটিভ না নেগেটিভ অর্থ বোঝায় তা বের করবো আমরা। সুতরাং, আমাদের হিসাব করতে হবে,
P(positive | overall liked the movie) - হলো বাক্যটি পজিটিভ অর্থে প্রকাশ করার সম্ভাবনা।
P(negative | overall liked the movie) - হলো বাক্যটি নেগেটিভ অর্থে প্রকাশ করার সম্ভাবনা।
তার আগে, প্রথমে, আমরা ইনপুট টেক্স থেকে স্টপওয়ার্ডসগুলো সরিয়ে ফেলি এবং স্টেমিং করি।
স্টপওয়ার্ডগুলি সরানো: এগুলি এমন সাধারণ শব্দ যা ক্লাসিফিকেশনে কন কাজে লাগে না।
স্টেমিংঃ শব্দের মূল বের করার জন্য স্টেমিং ব্যবহার করা হয়।
এখন এই দুটি প্রসেস ব্যবহার করার পরে, আমাদের টেক্সট হয়ে যায়ঃ
সবচেয়ে গুরুত্বপূর্ণ অংশটি হ'ল মেশিন লার্নিং অ্যালগরিদমকে কাজ করার জন্য ডেটা থেকে তার বৈশিষ্ট্যগুলি সন্ধান করা। এই ক্ষেত্রে, আমাদের ইনপুট টেক্সট আছে। আমাদের এই ইনপুট টেক্সটটিকে সংখ্যায় যদি রূপান্তর করা যায় তাহলে তা আমরা গুনতে পারি। আমরা শব্দের পরিমাণ( ফ্রিকোয়েন্সি ) ব্যবহার করতে পারি। এটি প্রতিটি টেক্সটে থাকা শব্দের একটি সেট হিসাবে আচরণ করছে। আমরা বৈশিষ্ট্য হিসেবে ওই শব্দের প্রতিটি সংখ্যা ধরে নিবো।
আমাদের ক্ষেত্রে, এই উপপাদ্যটি ব্যবহার করে আমাদের P(positive | overall liked the movie):
P(positive | overall liked the movie) = P(overall liked the movie | positive) * P(positive) / P(overall liked the movie)
যেহেতু ক্লাসিফিকেশনের জন্য আমাদের জানতে হবে যে কোন ট্যাগটির বেশি সম্ভাবনা রয়েছে, তাই আমরা উভয় ট্যাগের জন্য একই বিভাজক বাতিল করতে পারি,
P(overall liked the movie | positive)* P(positive) with P(overall liked the movie | negative) * P(negative)
যদিও একটি সমস্যা আছে : “overall liked the movie” আমাদের ট্রেনিং ডেটাসেটে আসে না, সুতরাং এটি ঘটার সম্ভাবনাটি শূন্য। এখানে, আমরা ‘naive’ শর্তটি ধরে নিই যে বাক্যটির প্রতিটি শব্দ অন্য শব্দগুলির থেকে পৃথক। এর অর্থ হ'ল আমরা এখন আলাদা আলাদা শব্দগুলির হিসাব করছি।
এটাকে এভাবেও লেখা যায় :
P(overall liked the movie) = P(overall) * P(liked) * P(the) * P(movie)
পরে শুধু বায়াসের উপপাদ্য প্রয়োগ করে পাই :
P(overall liked the movie| positive) = P(overall | positive) * P(liked | positive) * P(the | positive) * P(movie | positive)
এখন, এই আলাদা আলাদা শব্দগুলি আসলে আমাদের ট্রেনিং ডেটাতে বেশ কয়েকবার প্রদর্শিত হয় যার ফোলে আমরা সেগুলো গুনতে পারি !
প্রথমত, আমরা প্রতিটি ট্যাগের একটি প্রাথমিক সম্ভাবনা কেল্কুলেশন করি:
আমাদের ট্রেনিং ডেটাতে প্রদত্ত বাক্যটির জন্য, এটি ইতিবাচক P(positive) হওয়ার সম্ভাবনা 3/5। তারপরে, P(negative) হয় 2/5।
তারপরে P(overall | positive) বের করার অর্থ "overall" শব্দটি কতবার পজিটিভ অর্থে ব্যবহৃত হয়েছে (1) এবং মোট কতটি শব্দ পজিটিভ অর্থে ব্যবহৃত হয়েছে (11)। সুতরাং, P(overall | positive) = 1/17, P(liked/positive) = 1/17, P(the/positive) = 2/17, P(movie/positive) = 3/17।
যদি সম্ভাবনাটি শূন্য হয়ে আসে তবে ল্যাপ্লেস স্মুথিং ব্যবহার করে: আমরা প্রতিটি সম্ভাবনার সাথে 1 টি যুক্ত করি যাতে এটি কখনই শূন্য হয় না। আর এটার ভারসাম্য বজায় রাখার জন্য, আমরা বিভাজকের সাথে সম্ভাব্য শব্দের সংখ্যা যুক্ত করি। যার ফলে ভাগফল কখনই 1 এর বেশি হবে না। আর এখানে, মোট সম্ভাব্য শব্দের সংখ্যা 21 ।
স্মুথিং প্রয়োগের পরে, ফলাফল:
এখন আমরা কেবল সব সম্ভাব্যতাগুলিকে একত্র করে দেখি কার থেকে বড়:
P(overall | positive) * P(liked | positive) * P(the | positive) * P(movie | positive) * P(postive )
= 1.38 * 10^{-5} = 0.0000138
P(overall | negative) * P(liked | negative) * P(the | negative) * P(movie | negative) * P(negative)
= 0.13 * 10^{-5} = 0.0000013
আমাদের ক্লাসিফায়ার বাক্যটিকে পজিটিভ অর্থে ব্যবহৃত হয়েছে বলে দেয়।
পাইথন কোড:
# cleaning texts
import pandas as pd
import re
import nltk
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
from sklearn.feature_extraction.text import CountVectorizer
dataset = [["I liked the movie", "positive"],
["It’s a good movie. Nice story", "positive"],
["Hero’s acting is bad but heroine looks good.\
Overall nice movie", "positive"],
["Nice songs. But sadly boring ending.", "negative"],
["sad movie, boring movie", "negative"]]
dataset = pd.DataFrame(dataset)
dataset.columns = ["Text", "Reviews"]
nltk.download('stopwords')
corpus = []
for i in range(0, 5):
text = re.sub('[^a-zA-Z]', '', dataset['Text'][i])
text = text.lower()
text = text.split()
ps = PorterStemmer()
text = ''.join(text)
corpus.append(text)
# creating bag of words model
cv = CountVectorizer(max_features = 1500)
X = cv.fit_transform(corpus).toarray()
y = dataset.iloc[:, 1].values
# splitting the data set into training set and test set from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
# fitting naive bayes to the training set
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import confusion_matrix
classifier = GaussianNB();
classifier.fit(X_train, y_train)
# predicting test set results
y_pred = classifier.predict(X_test)
# making the confusion matrix
cm = confusion_matrix(y_test, y_pred)
cm