اگه دنبال یک پروژهی پایانی یا درسی برای رشتهی کامپیوتر یا فناوری اطلاعات هستید که هم واقعاً کاربردی باشه و هم توی جلسهی دفاع بتونید کامل توضیحش بدید، تحلیل احساسات (Sentiment Analysis) یکی از بهترین گزینههاست. در این راهنما با پایتون و کتابخانهی Hazm (اختصاصی پردازش متن فارسی)، یک مدل کامل میسازیم که نظرات فارسی رو به «مثبت» یا «منفی» تشخیص میده.
فهرست مطالب
- چرا این پروژه انتخاب خوبیه؟
- پیشنیازها
- مرحله ۱: آمادهسازی داده
- مرحله ۲: پیشپردازش متن فارسی با Hazm
- مرحله ۳: تبدیل متن به بردار عددی (TF-IDF)
- مرحله ۴: آموزش مدل طبقهبند
- مرحله ۵: ارزیابی مدل
- مرحله ۶: تست با یک نظر جدید
- ایدههایی برای منحصربهفردکردن پروژه
- اشتباهات رایج
- سوالات متداول
چرا این پروژه انتخاب خوبیه؟
تحلیل احساسات، یکی از پرکاربردترین زیرشاخههای پردازش زبان طبیعی (NLP) است — از تحلیل نظرات مشتریان فروشگاههای اینترنتی گرفته تا پایش شبکههای اجتماعی. چون بیشتر آموزشهای آمادهی این حوزه انگلیسیمحورن، نسخهی فارسیاش هم برای استاد راهنما تازهتره و هم واقعاً کاربرد بومی داره — مثلاً میتونید بعداً همین مدل رو روی نظرات یک فروشگاه اینترنتی واقعی تست کنید.
پیشنیازها
- آشنایی پایه با پایتون (لیست، تابع، حلقه)
- نصب کتابخانهها:
pip install pandas scikit-learn hazmمرحله ۱: آمادهسازی داده
برای نمایش مفهوم، اینجا یک دیتاست کوچک و دستی میسازیم. نکتهی مهم: برای یک پروژهی واقعی و قابلدفاع، حتماً به چند صد نمونهی واقعی (مثلاً نظرات جمعآوریشده از یک فروشگاه اینترنتی) نیاز دارید؛ چند نمونهی زیر فقط برای یادگیری ساختار کده:
import pandas as pd
data = {
"text": [
"این محصول عالی بود و کیفیتش فوقالعادهست",
"خیلی راضی بودم، حتماً دوباره سفارش میدم",
"بستهبندی تمیز و ارسال سریع، ممنون",
"بدترین خریدی بود که کردم",
"کیفیت پایین و ارسال دیرهنگام",
"اصلاً راضی نیستم، پولم رو هدر دادم"
],
"label": ["positive", "positive", "positive", "negative", "negative", "negative"]
}
df = pd.DataFrame(data)
print(df)مرحله ۲: پیشپردازش متن فارسی با Hazm
متن فارسی قبل از هر تحلیلی باید «نرمالسازی» بشه — یکسانسازی نیمفاصلهها، حروف عربی/فارسی مشابه و فاصلههای اضافه. کتابخانهی Hazm دقیقاً همین کار رو میکنه:
from hazm import Normalizer, WordTokenizer
normalizer = Normalizer()
tokenizer = WordTokenizer()
def preprocess(text):
text = normalizer.normalize(text)
tokens = tokenizer.tokenize(text)
return " ".join(tokens)
df["clean_text"] = df["text"].apply(preprocess)
print(df[["text", "clean_text"]])مرحله ۳: تبدیل متن به بردار عددی (TF-IDF)
مدلهای یادگیری ماشین با عدد کار میکنن، نه متن. روش TF-IDF به هر کلمه بر اساس تکرار و اهمیتش در کل داده، یک وزن عددی میده:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
df["clean_text"], df["label"], test_size=0.3, random_state=42
)
vectorizer = TfidfVectorizer()
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)مرحله ۴: آموزش مدل طبقهبند
برای شروع، از الگوریتم ساده و سریع Naive Bayes استفاده میکنیم — انتخاب رایج برای طبقهبندی متن:
from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()
model.fit(X_train_vec, y_train)مرحله ۵: ارزیابی مدل
from sklearn.metrics import accuracy_score, classification_report
y_pred = model.predict(X_test_vec)
print("دقت مدل:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))برای گزارش پروژه، حتماً این خروجیها رو با جدول و نمودار (مثلاً ماتریس درهمریختگی/Confusion Matrix) نشون بدید — دفاع پروژه رو خیلی قویتر میکنه.
مرحله ۶: تست با یک نظر جدید
new_comment = ["این محصول رو اصلاً پیشنهاد نمیکنم"]
new_comment_clean = [preprocess(c) for c in new_comment]
new_vec = vectorizer.transform(new_comment_clean)
prediction = model.predict(new_vec)
print("نتیجه:", prediction[0])تبریک میگم — همین الان یک مدل کامل تحلیل احساسات فارسی دارید که کار میکنه! 🎉
ایدههایی برای منحصربهفردکردن پروژه
استادها معمولاً پروژهی کپیشده رو زود تشخیص میدن. برای اینکه واقعاً مال خودتون بشه:
- بهجای دادهی دستی، از نظرات واقعی یک فروشگاه اینترنتی (با اجازه یا دادهی عمومی) استفاده کنید
- چند الگوریتم (Naive Bayes، Logistic Regression، SVM) رو با هم مقایسه کنید
- یک کلاس سوم («خنثی») به مدل اضافه کنید
- مدل رو با یک رابط سادهی وب (مثلاً Flask) قابلاستفاده کنید
اشتباهات رایج
- استفاده از دیتاست خیلی کوچک — با چند نمونه، مدل چیز معناداری یاد نمیگیره؛ برای نتیجهی واقعی حداقل چند صد نمونه لازمه.
- فراموشکردن نرمالسازی متن — بدون Hazm، کلمات مشابه (مثلاً «میروم» و «میروم») جدا از هم حساب میشن.
- دیتاست نامتوازن — اگه اکثر نمونهها مثبت باشن، مدل بهسمت پیشبینی «مثبت» متمایل میشه.
- ارزیابینکردن مدل روی دادهی جدا از آموزش — همیشه با
train_test_splitبخشی از داده رو برای تست کنار بذارید.
سوالات متداول
آیا این پروژه برای مقطع کارشناسی مناسبه؟
بله، ساختار پایهاش برای پروژهی درسی یا کارشناسی کاملاً مناسبه. برای کارشناسی ارشد، میتونید با یادگیری عمیق (مثل BERT فارسی) عمقش رو بیشتر کنید.
از کجا دادهی واقعی برای این پروژه پیدا کنم؟
میتونید نظرات عمومی یک فروشگاه اینترنتی رو جمعآوری کنید یا از دیتاستهای عمومی تحلیل احساسات فارسی که در انجمنهای علمی منتشر شدن استفاده کنید.
چرا از Hazm استفاده کردیم، نه کتابخانههای انگلیسی؟
کتابخانههای NLP انگلیسی (مثل NLTK) برای ساختار زبان فارسی طراحی نشدن؛ Hazm مخصوص چالشهای زبان فارسیه، مثل نیمفاصله و صرف افعال.
اگه وقت کافی برای پیادهسازی کامل ندارم چیکار کنم؟
میتونید از خدمات پروژه دانشجویی ما کمک بگیرید و روی مفاهیمی که اینجا یاد گرفتید، در جلسهی دفاع کاملاً مسلط باشید.
جمعبندی
حالا یک پروژهی کامل، اجراشدنی و قابلدفاع دارید که مفاهیم واقعی NLP و یادگیری ماشین رو نشون میده. اگه برای گسترش این پروژه، تهیهی دیتاست بزرگتر یا مستندسازی به کمک نیاز دارید، پروژههای آمادهی پایتون ما رو ببینید یا با تیم ما در تماس باشید.
نظرات کاربران
فقط نظرات تاییدشده مدیر نمایش داده میشود.