مشخصات پروژه
-
18
-
0.0
-
508
-
0
-
0
تحلیل احساسات نظرات کاربران با استفاده از یادگیری ماشین
در این پروژه، به بررسی یکی از پروژههای عملی یادگیری ماشین یعنی تحلیل احساسات نظرات کاربران فیلمها میپردازیم. ا
مقدمه
یادگیری ماشین (Machine Learning) به یکی از مهمترین و پرکاربردترین فناوریهای هوش مصنوعی تبدیل شده است که در بسیاری از صنایع و حوزهها مورد استفاده قرار میگیرد. پروژههای یادگیری ماشین به دلیل توانایی آنها در تحلیل دادهها، پیشبینیها و تصمیمگیریها، بسیار محبوب شدهاند. در این مقاله، به بررسی یکی از پروژههای عملی یادگیری ماشین یعنی تحلیل احساسات نظرات کاربران فیلمها میپردازیم. این پروژه میتواند به عنوان یک نمونه کاربردی در آموزش یادگیری ماشین مورد استفاده قرار گیرد.
مراحل پروژه ماشین لرنینگ
- جمعآوری و بارگذاری دادهها
- پیشپردازش دادهها
- استخراج ویژگیها
- آموزش مدل
- ارزیابی مدل
- پیشبینی احساسات نظرات جدید
برای شروع، دادههای نظرات فیلمها به زبان فارسی را آماده میکنیم. این دادهها شامل نظرات مثبت و منفی هستند. ابتدا، یک فایل اکسل حاوی دادهها ایجاد و سپس آن را بارگذاری میکنیم.
import pandas as pd # ایجاد دادههای نمونه برای تحلیل احساسات data = { 'review': [ "من واقعا این فیلم را دوست داشتم! بازیگری فوقالعاده بود و داستان بسیار جذاب بود.", "این بدترین فیلمی بود که تا به حال دیدهام. کاملاً وقت تلف کردن بود.", "فیلم بدی نبود، نه خیلی عالی و نه خیلی بد.", "داستان فوقالعاده و اجرای عالی بازیگران. شدیداً توصیه میکنم!", "من اصلاً از این فیلم لذت نبردم. داستان خیلی خستهکننده و قابل پیشبینی بود.", "فیلم لحظات خوبی داشت، اما در کل ناامید کننده بود.", "تصاویر شگفتانگیز و داستان جذاب. باید دید!", "فیلم خیلی کسلکننده و بیمزه بود.", "فیلم بسیار عالی با پیام قوی. بازیگران کار فوقالعادهای انجام دادند.", "من این فیلم را توصیه نمیکنم. عمق نداشت و ضعیف اجرا شده بود." ], 'sentiment': [ "positive", "negative", "neutral", "positive", "negative", "negative", "positive", "negative", "positive", "negative" ] } # ساخت DataFrame از دادهها df = pd.DataFrame(data) # ذخیره DataFrame به عنوان یک فایل Excel file_path = "IMDB_Dataset_Farsi.xlsx" df.to_excel(file_path, index=False)
برای پیشپردازش دادههای متنی فارسی، از کتابخانه Hazm استفاده میکنیم. این کتابخانه شامل ابزارهایی برای نرمالسازی، توکنسازی، حذف کلمات توقف و ریشهیابی کلمات است.
import re from hazm import Normalizer, word_tokenize, Stemmer, stopwords_list # بارگذاری مجموعه دادهها df = pd.read_excel('IMDB_Dataset_Farsi.xlsx') # نمایش چند نمونه از دادهها print(df.head()) # پیشپردازش دادهها normalizer = Normalizer() stop_words = set(stopwords_list()) stemmer = Stemmer() def preprocess_text_farsi(text): text = normalizer.normalize(text) words = word_tokenize(text) words = [stemmer.stem(word) for word in words if word not in stop_words] return ' '.join(words) df['review'] = df['review'].apply(preprocess_text_farsi) print(df.head())
برای استخراج ویژگیها از دادههای متنی، از تکنیک Bag of Words استفاده میکنیم. این تکنیک با استفاده از کتابخانه Scikit-learn پیادهسازی میشود.
from sklearn.feature_extraction.text import CountVectorizer vectorizer = CountVectorizer(max_features=5000) X = vectorizer.fit_transform(df['review']).toarray() y = df['sentiment'].apply(lambda x: 1 if x == 'positive' else 0) # تبدیل برچسبها به اعداد
مدل Naive Bayes برای طبقهبندی نظرات به مثبت و منفی آموزش داده میشود.
from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB # تقسیم دادهها به مجموعههای آموزش و تست X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # آموزش مدل model = MultinomialNB() model.fit(X_train, y_train)
مدل با استفاده از معیارهای دقت، ماتریس درهمریختگی و گزارش طبقهبندی ارزیابی میشود.
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report # پیشبینی بر روی دادههای تست y_pred = model.predict(X_test) # ارزیابی مدل accuracy = accuracy_score(y_test, y_pred) conf_matrix = confusion_matrix(y_test, y_pred) class_report = classification_report(y_test, y_pred) print(f'Accuracy: {accuracy}') print('Confusion Matrix:') print(conf_matrix) print('Classification Report:') print(class_report)
تابعی برای پیشبینی احساسات نظرات جدید بر اساس مدل آموزش دیده نوشته میشود.
def predict_sentiment(review): review = preprocess_text_farsi(review) review_vector = vectorizer.transform([review]).toarray() sentiment = model.predict(review_vector) return 'مثبت' if sentiment[0] == 1 else 'منفی' # متنهای ورودی برای تست test_reviews_farsi = [ "من واقعا این فیلم را دوست داشتم! بازیگری فوقالعاده بود و داستان بسیار جذاب بود.", "این بدترین فیلمی بود که تا به حال دیدهام. کاملاً وقت تلف کردن بود.", "فیلم بدی نبود، نه خیلی عالی و نه خیلی بد.", "داستان فوقالعاده و اجرای عالی بازیگران. شدیداً توصیه میکنم!", "من اصلاً از این فیلم لذت نبردم. داستان خیلی خستهکننده و قابل پیشبینی بود.", "فیلم لحظات خوبی داشت، اما در کل ناامید کننده بود.", "تصاویر شگفتانگیز و داستان جذاب. باید دید!", "فیلم خیلی کسلکننده و بیمزه بود.", "فیلم بسیار عالی با پیام قوی. بازیگران کار فوقالعادهای انجام دادند.", "من این فیلم را توصیه نمیکنم. عمق نداشت و ضعیف اجرا شده بود." ] # پیشبینی احساسات برای هر یک از متنهای تست for review in test_reviews_farsi: sentiment = predict_sentiment(review) print(f'نظر: {review}\nاحساس: {sentiment}\n')
0 من واقعا این فیلم را دوست داشتم! بازیگری فوقا... positive 1 این بدترین فیلمی بود که تا به حال دیدهام. کام... negative 2 فیلم بدی نبود، نه خیلی عالی و نه خیلی بد. neutral 3 داستان فوقالعاده و اجرای عالی بازیگران. شدیدا... positive 4 من اصلاً از این فیلم لذت نبردم. داستان خیلی خس... negative review sentiment 0 واقعا فیل دوس دا ! بازیگر فوقالعاده داس جذاب . positive 1 بد فیلم دیده . وق تلف . negative 2 فیل بد ، بد . neutral 3 داس فوقالعاده اجرا بازیگر . شدیدا توصیه ! positive 4 اصلا فیل لذ نبرد . داس خستهکننده پیشبین . negative Accuracy: 1.0 Confusion Matrix: [[1 0] [0 1]] Classification Report: precision recall f1-score support 0 1.00 1.00 1.00 1 1 1.00 1.00 1.00 1 accuracy 1.00 2 macro avg 1.00 1.00 1.00 2 weighted avg 1.00 1.00 1.00 2 نظر: من واقعا این فیلم را دوست داشتم! بازیگری فوقالعاده بود و داستان بسیار جذاب بود. احساس: مثبت نظر: این بدترین فیلمی بود که تا به حال دیدهام. کاملاً وقت تلف کردن بود. احساس: منفی نظر: فیلم بدی نبود، نه خیلی عالی و نه خیلی بد. احساس: منفی نظر: داستان فوقالعاده و اجرای عالی بازیگران. شدیداً توصیه میکنم! احساس: مثبت نظر: من اصلاً از این فیلم لذت نبردم. داستان خیلی خستهکننده و قابل پیشبینی بود. احساس: منفی نظر: فیلم لحظات خوبی داشت، اما در کل ناامید کننده بود. احساس: منفی نظر: تصاویر شگفتانگیز و داستان جذاب. باید دید! احساس: مثبت نظر: فیلم خیلی کسلکننده و بیمزه بود. احساس: منفی نظر: فیلم بسیار عالی با پیام قوی. بازیگران کار فوقالعادهای انجام دادند. احساس: مثبت نظر: من این فیلم را توصیه نمیکنم. عمق نداشت و ضعیف اجرا شده بود. احساس: منفی
جدول اول شامل دادههای ورودی اولیه نظرات کاربران به همراه برچسبهای احساسی آنها است:
review sentiment 0 ...من واقعا این فیلم را دوست داشتم! بازیگری فوقا positive 1 ...این بدترین فیلمی بود که تا به حال دیدهام. کام negative 2 فیلم بدی نبود، نه خیلی عالی و نه خیلی بد. neutral 3 ...داستان فوقالعاده و اجرای عالی بازیگران. شدیدا positive 4 ...من اصلاً از این فیلم لذت نبردم. داستان خیلی خس negative
جدول دوم نشاندهنده متنهای پیشپردازش شده است:
review sentiment 0 واقعا فیل دوس دا ! بازیگر فوقالعاده داس جذاب . positive 1 بد فیلم دیده . وق تلف . negative 2 فیل بد ، بد . neutral 3 داس فوقالعاده اجرا بازیگر . شدیدا توصیه ! positive 4 اصلا فیل لذ نبرد . داس خستهکننده پیشبین . negative
پیشپردازش دادهها شامل نرمالسازی، توکنسازی، حذف کلمات توقف و ریشهیابی کلمات است که متنهای ورودی را سادهتر و تمیزتر میکند. در این مرحله، کلمات اضافی حذف میشوند و کلمات به ریشههای خود تبدیل میشوند تا مدل بتواند بهتر دادهها را تحلیل کند.
دقت مدل به صورت زیر گزارش شده است:
Accuracy: 1.0
این مقدار نشان میدهد که مدل تمامی نمونههای تست را به درستی طبقهبندی کرده است. هرچند این مقدار بسیار بالا است، اما باید توجه داشت که تعداد نمونههای تست کم است و این ممکن است به دلیل عدم تعمیم مدل در شرایط واقعی باشد.
ماتریس درهمریختگی به شکل زیر است:
Confusion Matrix: [[1 0] [0 1]]
این ماتریس نشان میدهد که مدل هیچ خطایی در تشخیص نمونهها نداشته است:
- 1 نمونه مثبت به درستی تشخیص داده شده است (True Positive).
- 1 نمونه منفی به درستی تشخیص داده شده است (True Negative).
گزارش طبقهبندی به صورت زیر است:
Classification Report: precision recall f1-score support 0 1.00 1.00 1.00 1 1 1.00 1.00 1.00 1 accuracy 1.00 2 macro avg 1.00 1.00 1.00 2 weighted avg 1.00 1.00 1.00 2
این گزارش شامل معیارهای زیر است:
- Precision: درصد نمونههای درست تشخیص داده شده از کل نمونههای تشخیص داده شده.
- Recall: درصد نمونههای درست تشخیص داده شده از کل نمونههای واقعی.
- F1-Score: میانگین هماهنگ Precision و Recall.
- Support: عداد کل نمونههای هر دسته.
نتایج پیشبینی احساسات برای نظرات جدید به شرح زیر است:
نظر: من واقعا این فیلم را دوست داشتم! بازیگری فوقالعاده بود و داستان بسیار جذاب بود. احساس: مثبت نظر: این بدترین فیلمی بود که تا به حال دیدهام. کاملاً وقت تلف کردن بود. احساس: منفی نظر: فیلم بدی نبود، نه خیلی عالی و نه خیلی بد. احساس: منفی نظر: داستان فوقالعاده و اجرای عالی بازیگران. شدیداً توصیه میکنم! احساس: مثبت نظر: من اصلاً از این فیلم لذت نبردم. داستان خیلی خستهکننده و قابل پیشبینی بود. احساس: منفی نظر: فیلم لحظات خوبی داشت، اما در کل ناامید کننده بود. احساس: منفی نظر: تصاویر شگفتانگیز و داستان جذاب. باید دید! احساس: مثبت نظر: فیلم خیلی کسلکننده و بیمزه بود. احساس: منفی نظر: فیلم بسیار عالی با پیام قوی. بازیگران کار فوقالعادهای انجام دادند. احساس: مثبت نظر: من این فیلم را توصیه نمیکنم. عمق نداشت و ضعیف اجرا شده بود. احساس: منفی
نتیجهگیری
در این مقاله، یک پروژه کامل برای تحلیل احساسات نظرات کاربران فیلمها با استفاده از یادگیری ماشین ارائه شد. مراحل شامل جمعآوری دادهها، پیشپردازش، استخراج ویژگیها، آموزش مدل و ارزیابی آن توضیح داده شد. همچنین، نحوه استفاده از مدل برای پیشبینی احساسات نظرات جدید نیز نشان داده شد. این پروژه میتواند به عنوان یک پایه برای آموزشهای بیشتر و پروژههای پیچیدهتر در حوزه یادگیری ماشین و هوش مصنوعی مورد استفاده قرار گیرد.
نظرات شما