---
title: "تحلیل احساسات با پایتون: VADER در برابر Hugging Face"
description: "تحلیل احساسات در پایتون به متن برچسب مثبت، خنثی یا منفی می‌دهد. نظرهای محصول را با VADER از NLTK و یک مدل Hugging Face امتیاز می‌دهیم و مقایسه می‌کنیم."
url: https://proxynet.io/fa/blog/sentiment-analysis-python
date: 2026-09-28
author: "Acar Diveroli"
category: "آموزش‌ها, هوش مصنوعی"
lang: fa
---

# تحلیل احساسات با پایتون: VADER در برابر Hugging Face

تیم شما سه محصول می‌فروشد و برای هر کدام چند هزار نظر مشتری دارد. میانگین ستاره‌ها از ماهی به ماه دیگر تقریباً تکان نمی‌خورد، اما پشتیبانی می‌گوید شکایت‌ها درباره یکی از محصولات دو برابر شده است. خواندن همه نظرها ممکن نیست، پس اسکریپتی می‌خواهید که هر نظر را مثبت، خنثی یا منفی علامت بزند و نشان دهد حال‌وهوای مشتریان کجا در حال تغییر است. نخستین آموزشی که پیدا می‌کنید از VADER استفاده می‌کند، دومی از یک مدل ترنسفورمر، و این دو برای یک جمله واحد پاسخ‌های متفاوتی می‌دهند.

این راهنما هر دو روش را روی یک مجموعه کوچک و یکسان از نظرهای محصول اجرا می‌کند. توضیح می‌دهیم هر روش چگونه کار می‌کند، کد کامل و آزموده را می‌آوریم (یک مرحله مبتنی بر واژه‌نامه با NLTK، یک مرحله مبتنی بر مدل با تابع `pipeline` از Hugging Face و گزارشی که نتایج را بر اساس محصول و ماه گروه‌بندی می‌کند)، نشان می‌دهیم هر روش تا چه اندازه با امتیاز ستاره‌ای هم‌خوان بود و کدام نظرها هر دو را فریب دادند. همه اسکریپت‌ها در 28 سپتامبر 2026 با Python 3.13، nltk 3.10.3، pandas 3.0.6، transformers 5.17.0 و نسخه CPU از torch 2.14 اجرا شدند.

> **نکته: پاسخ کوتاه**
>
> تحلیل احساسات به یک متن نگرشی نسبت می‌دهد: معمولاً مثبت، خنثی یا منفی، و گاهی امتیازی از 1 تا 5 ستاره. در پایتون سریع‌ترین شروع، VADER از کتابخانه NLTK است: `SentimentIntensityAnalyzer().polarity_scores(text)` یک امتیاز `compound` بین `-1` و `+1` برمی‌گرداند و نویسندگان VADER مقدار `0.05` و بالاتر را مثبت و `-0.05` و پایین‌تر را منفی می‌دانند. این روش سریع است، اما واژه‌های انگلیسی را می‌خواند، نه بافت جمله را. یک مدل ترنسفورمر که با `pipeline("sentiment-analysis", model=...)` بارگذاری شود کل جمله و زبان‌های دیگر را می‌خواند، به بهای دانلودی حجیم و زمان پردازش بیشتر. روی 24 نظر آزمایشی ما، VADER در 58% موارد با امتیاز ستاره‌ای هم‌خوان بود و مدل `nlptown/bert-base-multilingual-uncased-sentiment` در 79% موارد. پیش از اعتماد به هر کدام، آن را روی نمونه‌ای برچسب‌خورده از داده‌های خودتان بیازمایید.

## تحلیل احساسات چیست؟

تحلیل احساسات که نظرکاوی هم نامیده می‌شود، کار تشخیص نگرشی است که یک متن بیان می‌کند. برای نظرهای محصول، خروجی معمولاً یکی از سه برچسب (مثبت، خنثی، منفی) یا یک امتیاز ستاره‌ای است و اغلب با یک امتیاز اطمینان همراه است. ابزارهای تحلیل در سطح جنبه یک قدم جلوتر می‌روند و جمله‌ای مثل «صدای عالی، باتری ضعیف» را به دو نظر جدا تقسیم می‌کنند؛ این کار نوع دیگری از مدل می‌خواهد و خارج از این راهنماست.

مانند روش‌های نوشته [داده‌کاوی: روش‌ها، کاربردها و تهیه داده](/fa/blog/what-is-data-mining)، تحلیل احساسات متن بی‌ساختار را به ستونی تبدیل می‌کند که می‌توانید آن را بشمارید و نمودارش را بکشید. ارزش کار در روند است، نه در یک امتیاز تنها: برای نمونه، بالا رفتن سهم نظرهای منفی یک محصول پس از عوض شدن تأمین‌کننده.

## تحلیل احساسات در پایتون چگونه کار می‌کند؟

دو خانواده ابزار وجود دارد و سازوکار آن‌ها بسیار متفاوت است.

**مبتنی بر واژه‌نامه (VADER).** VADER، کوته‌نوشت Valence Aware Dictionary and sEntiment Reasoner، فهرستی از حدود 7,500 واژه، شکلک و اصطلاح عامیانه انگلیسی است که ارزیاب‌های انسانی از بسیار منفی تا بسیار مثبت به آن‌ها امتیاز داده‌اند، به‌علاوه مجموعه‌ای از قاعده‌ها. این قاعده‌ها امتیاز را با `!!!` و حروف بزرگ بالا می‌برند، به واژه‌های پس از «but» وزن بیشتری از واژه‌های پیش از آن می‌دهند و وقتی یک واژه نفی مانند «not» یا «never» تا سه واژه پیش از یک واژه احساسی بیاید، علامت امتیاز را برعکس می‌کنند. [README کتابخانه vaderSentiment](https://github.com/cjhutto/vaderSentiment) این قاعده‌ها و آستانه‌ها را شرح می‌دهد. NLTK همین تحلیلگر را با نام `nltk.sentiment.vader` ارائه می‌کند که در [راهنمای تحلیل احساسات NLTK](https://www.nltk.org/howto/sentiment.html) مستند شده است.

**مبتنی بر مدل (ترنسفورمرها).** ترنسفورمری مانند BERT ابتدا روی حجم زیادی از متن آموزش دیده و سپس با نمونه‌هایی که برچسب احساس دارند تنظیم دقیق (fine-tune) شده است. این مدل کل جمله را به عدد تبدیل می‌کند و هر واژه را در پرتو واژه‌های دیگر می‌خواند، بنابراین عبارت‌هایی مثل «not bad» و «killer» بر اساس بافت جمله سنجیده می‌شوند، نه با یک مقدار ثابت. Hugging Face هزاران مدل از این نوع را میزبانی می‌کند و تابع `pipeline` آن یکی از آن‌ها را با یک خط کد بارگذاری می‌کند.

در هر دو حالت، امتیازدهی در پنج گام انجام می‌شود:

1. **بارگذاری متن.** برای هر نظر یک ردیف، همراه با محصول، تاریخ و اگر در دسترس است، امتیاز ستاره‌ای.
2. **تقسیم یا توکن‌سازی.** VADER با واژه‌ها و نشانه‌های نگارشی کار می‌کند. ترنسفورمر توکنایزر خودش را دارد که واژه‌ها را به تکه‌های کوچک‌تر می‌شکند و در یک طول بیشینه متوقف می‌شود (512 توکن برای مدل‌های مبتنی بر BERT).
3. **امتیازدهی.** VADER ارزش واژه‌ها را جمع می‌زند، قاعده‌هایش را اعمال می‌کند و سپس مجموع را در یک مقدار `compound` بین `-1` و `+1` فشرده می‌کند. مدل برای هر برچسب یک احتمال برمی‌گرداند.
4. **نگاشت به برچسب.** برای VADER آستانه‌ها را خودتان انتخاب می‌کنید. برای مدل، برچسبی را که بیشترین احتمال را دارد برمی‌دارید و امتیاز را به‌عنوان اطمینان نگه می‌دارید.
5. **تجمیع.** برچسب‌ها را بر اساس محصول، هفته یا ماه بشمارید و نتایج را کنار عددهایی بگذارید که از قبل دنبال می‌کنید.

## مقایسه VADER و مدل ترنسفورمر

| | VADER (NLTK) | ترنسفورمر (Hugging Face) |
|---|---|---|
| روش تصمیم‌گیری | فهرست واژه‌های امتیازدار به‌علاوه قاعده‌ها | شبکه عصبی تنظیم‌شده روی متن برچسب‌خورده |
| حجم نصب | nltk به‌علاوه واژه‌نامه‌ای 90 KB | transformers، torch (حدود 500 MB برای نسخه CPU) و یک مدل (670 MB برای مدل زیر) |
| سرعت در آزمون ما (CPU لپ‌تاپ، نظرهای کوتاه) | حدود 14,000 نظر در ثانیه | حدود 90 نظر در ثانیه، با GPU بیشتر |
| زبان‌ها | انگلیسی | بسته به مدل؛ مدل زیر شش زبان را پوشش می‌دهد |
| بافت و نفی | قاعده‌محور، پنجره سه‌واژه‌ای | آموخته از نمونه‌ها |
| خروجی | سهم neg / neu / pos و یک امتیاز `compound` | برچسب و احتمال، یا امتیاز ستاره‌ای |
| توضیح یک نتیجه | آسان: واژه‌ها را جست‌وجو کنید | دشوار: ابزار اضافی لازم است |
| آزمون 24 نظری ما | 14 از 24 با ستاره‌ها هم‌خوان بود (58%) | 19 از 24 هم‌خوان بود (79%) |

ردیف آخر از یک مجموعه داده بسیار کوچک و دست‌نویس به دست آمده است. این ردیف نوع خطاهای هر روش را نشان می‌دهد، نه عملکرد آن‌ها روی داده‌های شما را.

## انتخاب مدل Hugging Face برای نظرهای محصول

بسیاری از مدل‌های تحلیل احساسات در هاب Hugging Face روی توییت‌ها یا نقدهای فیلم آموزش دیده‌اند. برای نظرهای محصول سه چیز اهمیت دارد:

- **داده آموزشی.** مدلی که روی توییت‌ها آموزش دیده زبان عامیانه را می‌شناسد؛ مدلی که روی نظرهای محصول آموزش دیده واژگان محصول را.
- **برچسب‌ها.** سه برچسب، پنج برچسب یا امتیاز ستاره‌ای. آن‌ها را در یک نقطه از کد به برچسب‌های خودتان نگاشت کنید.
- **مجوز.** برخی مدل‌های پرطرفدار مجوز غیرتجاری دارند. کارت مدل را بخوانید.

ما سه مدل کوچک چندزبانه را روی همان 24 نظر آزمودیم و در کد زیر از [`nlptown/bert-base-multilingual-uncased-sentiment`](https://huggingface.co/nlptown/bert-base-multilingual-uncased-sentiment) استفاده کردیم. این مدل روی نظرهای محصول به زبان‌های انگلیسی، هلندی، آلمانی، فرانسوی، اسپانیایی و ایتالیایی تنظیم دقیق شده، یک تا پنج ستاره پیش‌بینی می‌کند و مجوز MIT دارد. کارت مدل برای انگلیسی دقت 67% در ستاره دقیق و 95% با خطای حداکثر یک ستاره گزارش می‌کند. ترکی جزو زبان‌های آن نیست، بنابراین یک نظر ترکی حدسی دریافت می‌کند، نه پاسخی آموخته.

دو مدل دیگر `lxyuan/distilbert-base-multilingual-cased-sentiments-student` (سه برچسب، Apache 2.0) بود که در 13 نظر از 24 با ستاره‌های ما هم‌خوان بود، و `tabularisai/multilingual-sentiment-analysis` (پنج برچسب، 16 از 24) که مجوز CC BY-NC 4.0 دارد و در نتیجه برای استفاده تجاری آزاد نیست.

## داده آزمایشی: 24 نظر محصول

از نظرهای اسکرپ‌شده استفاده نکردیم. فایل زیر 24 نظر دارد که خودمان برای سه محصول خیالی نوشته‌ایم، هر کدام با تاریخ و امتیاز ستاره‌ای، تا بتوان هر دو روش را با امتیاز سنجید. مواردی را گنجانده‌ایم که در داده واقعی دردسر درست می‌کنند: طعنه، زبان عامیانه، نفی، احساسات آمیخته، و یک نظر به هر یک از زبان‌های آلمانی، اسپانیایی و ترکی. آن را با نام `reviews.csv` ذخیره کنید:

```text
review_id,product,date,rating,lang,text
1,kettle,2026-07-02,5,en,"Boils a full litre in under three minutes and the lid never drips. Love it."
2,kettle,2026-07-05,4,en,"Solid kettle, a bit loud but it does the job."
3,kettle,2026-07-11,1,en,"Stopped working after two weeks. Support never answered my emails."
4,kettle,2026-07-19,2,en,"The handle gets hot. Not great, not terrible."
5,kettle,2026-08-03,5,en,"Best purchase this year!!! Fast, quiet and it looks good on the counter :)"
6,kettle,2026-08-14,1,en,"Oh great, another kettle that leaks all over the counter. Just what I needed."
7,kettle,2026-08-21,3,en,"It is a kettle. It boils water."
8,kettle,2026-08-30,4,de,"Kocht schnell und ist leise. Gutes Preis-Leistungs-Verhältnis."
9,headphones,2026-07-03,5,en,"The noise cancelling is superb and the battery lasts all week."
10,headphones,2026-07-09,2,en,"Sound is fine but the ear cushions started peeling after a month."
11,headphones,2026-07-15,4,en,"Comfortable for long flights. The app is clunky though."
12,headphones,2026-07-28,1,en,"Right ear cut out on day three. Returned them."
13,headphones,2026-08-06,5,es,"Suenan de maravilla y la batería dura muchísimo."
14,headphones,2026-08-12,3,en,"Bass is heavy. Some people will like it, I am not sure I do."
15,headphones,2026-08-24,2,en,"I wanted to love these, but the Bluetooth keeps dropping."
16,headphones,2026-08-29,4,en,"Not bad at all for the price."
17,backpack,2026-07-01,5,en,"Survived a rainy week in the mountains and everything inside stayed dry."
18,backpack,2026-07-13,4,en,"Lots of pockets. The laptop sleeve is a little tight for a 16 inch model."
19,backpack,2026-07-22,1,en,"The zipper broke on the first trip. Cheap material."
20,backpack,2026-08-02,3,tr,"Fiyatına göre idare eder ama askılar biraz ince."
21,backpack,2026-08-09,5,en,"Killer design, this bag is sick!"
22,backpack,2026-08-17,2,en,"Looks nice in the photos, feels flimsy in real life."
23,backpack,2026-08-26,4,en,"Carries my camera gear without any back pain."
24,backpack,2026-08-31,1,en,"Terrible stitching. The strap tore off after a week."
```

داده واقعی نظرها پیش از امتیازدهی به یک دور پاک‌سازی نیاز دارد: ردیف‌های تکراری، HTML باقی‌مانده در متن و نویسه‌های خراب. نوشته [پاک‌سازی داده‌های اسکرپینگ با pandas در Python](/fa/blog/clean-scraped-data-with-pandas) این مرحله را پوشش می‌دهد.

## گام 1: امتیازدهی نظرها با VADER

دو کتابخانه را در یک محیط مجازی نصب کنید:

```bash
python -m venv .venv
.venv\Scripts\activate          # macOS/Linux: source .venv/bin/activate
pip install nltk pandas
```

اسکریپت هر جمله را جداگانه امتیاز می‌دهد و از نتایج میانگین می‌گیرد. این کار را پس از اجرای اول اضافه کردیم: وقتی نظر 1 («…the lid never drips. Love it.») به‌صورت یک رشته واحد امتیاز گرفت، نتیجه `-0.52` شد، چون پنجره نفی سه‌واژه‌ای VADER از روی نقطه پایان جمله گذشت و «love» را برعکس کرد. با امتیازدهی جمله‌به‌جمله، نتیجه `+0.32` شد.

```python
import re

import nltk
import pandas as pd
from nltk.sentiment.vader import SentimentIntensityAnalyzer

nltk.download("vader_lexicon", quiet=True)  # 90 KB lexicon, downloaded once

analyzer = SentimentIntensityAnalyzer()
SENTENCE_END = re.compile(r"(?<=[.!?])\s+")

def vader_compound(text: str) -> float:
    """Score each sentence separately and average the compound scores."""
    sentences = [s for s in SENTENCE_END.split(text) if s.strip()]
    scores = [analyzer.polarity_scores(s)["compound"] for s in sentences]
    return round(sum(scores) / len(scores), 4)

def vader_label(compound: float) -> str:
    # thresholds recommended by the VADER authors
    if compound >= 0.05:
        return "positive"
    if compound <= -0.05:
        return "negative"
    return "neutral"

df = pd.read_csv("reviews.csv", parse_dates=["date"])
df["compound"] = df["text"].apply(vader_compound)
df["vader"] = df["compound"].apply(vader_label)

print(df[["review_id", "lang", "compound", "vader"]].to_string(index=False))
df.to_csv("reviews_vader.csv", index=False)
```

بخشی از خروجی:

```text
 review_id lang  compound    vader
         1   en    0.3185 positive
         3   en    0.0878 positive
         6   en    0.3125 positive
         8   de    0.0000  neutral
        17   en    0.4588 positive
        21   en   -0.8356 negative
```

نظر 3 شکایتی یک‌ستاره است، اما «support» در واژه‌نامه واژه‌ای مثبت است و هیچ واژه منفی‌ای بر آن غلبه نمی‌کند. نظر 6 طعنه است («Oh great … Just what I needed») و VADER واژه «great» را به معنای ظاهری‌اش می‌گیرد. نظر آلمانی دقیقاً صفر می‌گیرد، چون هیچ‌کدام از واژه‌هایش در واژه‌نامه انگلیسی نیست. نظر 21 «killer» و «sick» را در معنای ستایش به کار می‌برد؛ VADER هر دو واژه را فقط در معنای منفی‌شان می‌شناسد.

## گام 2: امتیازدهی همان نظرها با یک مدل Hugging Face

مرحله مدل به transformers و یک بک‌اند یادگیری عمیق نیاز دارد. اگر GPU ندارید، ابتدا نسخه CPU از torch را نصب کنید؛ حجم آن بسیار کمتر از نسخه پیش‌فرض همراه با CUDA است:

```bash
pip install torch --index-url https://download.pytorch.org/whl/cpu
pip install transformers
```

اجرای اول مدل را (حدود 670 MB) در کش Hugging Face دانلود می‌کند. اگر می‌خواهید این کش روی دیسک دیگری باشد، متغیر محیطی `HF_HOME` را تنظیم کنید. نام وظیفه `sentiment-analysis` نام مستعار `text-classification` است؛ پارامترهای `batch_size`، `truncation` و `device` در [مستندات pipelineهای Transformers](https://huggingface.co/docs/transformers/main_classes/pipelines) توضیح داده شده‌اند.

```python
import pandas as pd
from transformers import pipeline

MODEL = "nlptown/bert-base-multilingual-uncased-sentiment"

classifier = pipeline(
    "sentiment-analysis",  # alias of "text-classification"
    model=MODEL,
    device="cpu",          # device=0 for the first GPU
)

df = pd.read_csv("reviews_vader.csv", parse_dates=["date"])
results = classifier(
    df["text"].tolist(),
    batch_size=8,
    truncation=True,       # reviews longer than 512 tokens are cut, not rejected
)

def stars_to_label(stars: int) -> str:
    if stars >= 4:
        return "positive"
    if stars == 3:
        return "neutral"
    return "negative"

df["hf_stars"] = [int(r["label"][0]) for r in results]  # "4 stars" -> 4
df["hf_score"] = [round(r["score"], 3) for r in results]
df["hf"] = df["hf_stars"].apply(stars_to_label)

print(df[["review_id", "rating", "hf_stars", "hf_score", "vader", "hf"]].to_string(index=False))
df.to_csv("reviews_scored.csv", index=False)
```

با مدلی که از قبل در کش بود، اسکریپت روی CPU یک لپ‌تاپ، همراه با بارگذاری، حدود هفت ثانیه طول کشید. بخشی از خروجی:

```text
 review_id  rating  hf_stars  hf_score    vader       hf
         3       1         1     0.736 positive negative
         6       1         1     0.230 positive negative
         8       4         5     0.526  neutral positive
        17       5         1     0.562 positive negative
        20       3         3     0.622  neutral  neutral
        21       5         1     0.816 negative negative
```

مدل شکایت نظر 3، طعنه نظر 6 (با اطمینان پایین 0.23) و نظر آلمانی را درست تشخیص داد. در نظر 17، یعنی کوله‌پشتی‌ای که «survived a rainy week»، اشتباه کرد و زبان عامیانه نظر 21 را با اطمینان بالا یک ستاره خواند. نظر 20 ترکی است، زبانی که مدل روی آن آموزش ندیده؛ سه ستاره‌اش درست درآمد، اما ما به آن تکیه نمی‌کنیم.

## گام 3: تجمیع بر اساس محصول و ماه

گزارش هر دو روش را با امتیاز ستاره‌ای می‌سنجد، برای هر محصول و ماه یک امتیاز احساس خالص (سهم نظرهای مثبت منهای سهم نظرهای منفی) می‌سازد و نظرهایی را که دو روش درباره‌شان اختلاف دارند در فایلی می‌نویسد تا یک نفر آن‌ها را بخواند.

```python
import pandas as pd

df = pd.read_csv("reviews_scored.csv", parse_dates=["date"])

def stars_to_label(rating: int) -> str:
    if rating >= 4:
        return "positive"
    if rating == 3:
        return "neutral"
    return "negative"

df["truth"] = df["rating"].apply(stars_to_label)
for method in ("vader", "hf"):
    hit = (df[method] == df["truth"]).mean()
    print(f"{method}: {hit:.0%} agree with the star rating")
off_by_one = ((df["hf_stars"] - df["rating"]).abs() <= 1).mean()
print(f"model stars within one star of the rating: {off_by_one:.0%}")

# Net sentiment: share of positive minus share of negative, from -1 to +1
NET = {"positive": 1, "neutral": 0, "negative": -1}
df["net"] = df["hf"].map(NET)
df["month"] = df["date"].dt.to_period("M")

by_product = (
    df.groupby("product")
    .agg(reviews=("review_id", "count"),
         net=("net", "mean"),
         negative_share=("hf", lambda s: (s == "negative").mean()),
         avg_rating=("rating", "mean"))
    .round(2)
    .sort_values("net")
)
print(by_product.to_string())

by_month = df.pivot_table(index="month", columns="product", values="net", aggfunc="mean").round(2)
print(by_month.to_string())

# Rows where the two methods disagree go to a person for review
disagree = df[df["vader"] != df["hf"]]
print(f"{len(disagree)} of {len(df)} reviews need a human look")
disagree[["review_id", "rating", "vader", "hf", "text"]].to_csv("review_queue.csv", index=False)
```

```text
vader: 58% agree with the star rating
hf: 79% agree with the star rating
model stars within one star of the rating: 92%
            reviews   net  negative_share  avg_rating
product
backpack          8 -0.25            0.50        3.12
headphones        8  0.12            0.25        3.25
kettle            8  0.12            0.38        3.12
product  backpack  headphones  kettle
month
2026-07     -0.33       -0.25    0.00
2026-08     -0.20        0.50    0.25
11 of 24 reviews need a human look
```

کوله‌پشتی و کتری میانگین امتیاز یکسان 3.12 دارند، اما نیمی از نظرهای کوله‌پشتی منفی خوانده می‌شوند، در برابر 38% برای کتری؛ فاصله‌ای که میانگین ستاره‌ها پنهانش می‌کند. با هشت نظر برای هر محصول، یک نظر احساس خالص را 0.25 جابه‌جا می‌کند، پس پیش از رسم نمودار برای هر گروه حداقل تعدادی تعیین کنید. شیوه ذخیره ردیف‌های امتیازدار برای اجرای بعدی در نوشته [ذخیره داده‌های اسکرپینگ در CSV، JSON و SQLite](/fa/blog/save-scraped-data-csv-json-sqlite) آمده است.

## نظرها از کجا می‌آیند؟

برای کد فرقی نمی‌کند متن از کجا آمده باشد، اما منبع تعیین می‌کند با آن چه کاری مجاز هستید:

- **فروشگاه خودتان، کنسول فروشگاه اپلیکیشن یا سامانه پشتیبانی.** تمیزترین منبع است و امتیاز ستاره‌ای لازم برای سنجش مدل را هم در خود دارد.
- **پلتفرم‌های نظر و بازارگاه‌های آنلاین.** بسیاری از آن‌ها API رسمی یا خروجی ویژه فروشندگان دارند. پیش از فکر کردن به اسکرپینگ از آن استفاده کنید.
- **صفحه‌های عمومی.** از robots.txt و شرایط استفاده پیروی کنید، نرخ درخواست را پایین نگه دارید و نام نویسندگان نظرها و پیوند پروفایلشان را کنار بگذارید. نوشته‌های [آیا اسکرپینگ وب قانونی است؟](/fa/blog/is-data-web-scraping-legal) و [مدیریت داده‌های شخصی (PII) در مجموعه‌داده‌های اسکرپ‌شده](/fa/blog/personal-data-in-scraped-datasets) قاعده‌ها را توضیح می‌دهند.

وقتی یک بازارگاه نظرها یا قیمت‌های متفاوتی برای هر کشور نشان می‌دهد، یک [پروکسی مسکونی](https://proxynet.io/fa/residential-proxy) با هدف‌گیری کشور به شما امکان می‌دهد صفحه‌ای را ببینید که یک خریدار محلی می‌بیند.

## کاربردها

- **پژوهش محصول و دسته‌بندی:** مقایسه اینکه خریداران درباره محصولات شما و محصولات یک رقیب چگونه حرف می‌زنند، به‌عنوان بخشی از [تحقیقات بازار](/fa/market-research).
- **پایش تجارت الکترونیک:** دنبال کردن احساس نظرها در کنار داده‌های قیمت و موجودی در چند بازارگاه؛ صفحه [پروکسی تجارت الکترونیک](/fa/e-commerce-proxy) و نوشته [رصد قیمت رقبا](/fa/blog/competitor-price-tracking) را ببینید.
- **حفاظت از برند:** تشخیص موج ناگهانی نظرهای منفی که از کالای تقلبی یا فروشندگان غیرمجاز حرف می‌زنند؛ صفحه [حفاظت از برند](/fa/brand-protection) را ببینید.
- **پژوهش سرمایه‌گذاری:** احساس نظرها و شبکه‌های اجتماعی یکی از ورودی‌های مجموعه‌های [داده‌های جایگزین](/fa/blog/what-is-alternative-data) است.
- **اولویت‌بندی در پشتیبانی:** فرستادن نظرهای یک‌ستاره و نظرهای کم‌اطمینان ابتدا به یک نفر.

## اشتباهات رایج و دام‌ها

- **امتیازدهی یک پاراگراف کامل با VADER در یک مرحله.** قاعده‌های نفی و «but» می‌توانند از مرز جمله‌ها بگذرند، همان‌طور که نظر 1 نشان داد. جمله‌ها را جدا امتیاز دهید و سپس ترکیب کنید.
- **اجرای VADER روی زبان‌های دیگر.** واژه‌های ناشناخته صفر می‌گیرند، بنابراین نظرهای آلمانی و اسپانیایی خنثی درمی‌آیند. از یک مدل چندزبانه استفاده کنید، یا نظرها را بر اساس زبان گروه‌بندی کنید و برای هر زبان مدلی جدا برگزینید.
- **سپردن طعنه و زبان عامیانه به هر یک از دو روش.** هر دو جمله «Killer design, this bag is sick!» را نظری یک‌ستاره می‌خوانند.
- **نادیده گرفتن حوزه.** «غیرقابل‌پیش‌بینی» برای داستان یک فیلم خوب است و برای ترمز خودرو بد. نمونه‌ای از دسته محصول خودتان را بررسی کنید.
- **برابر دانستن توافق با حقیقت.** نظر 21 در صف اختلاف‌ها نیامد، چون هر دو روش به یک شکل اشتباه کردند. یک نمونه کوچک با برچسب دستی نگه دارید و با آن بسنجید.
- **دور انداختن امتیاز اطمینان.** برچسبی با امتیاز 0.23، مثل برچسب نظر 6، کمی بهتر از یک حدس است. امتیازهای پایین را به یک نفر بسپارید.
- **فراموش کردن کوتاه‌سازی.** بدون `truncation=True`، نظری که از حد مدل بلندتر باشد خطا می‌دهد و کل دسته را متوقف می‌کند.
- **رسم نمودار برای گروه‌های بسیار کوچک.** احساس خالصی که از پنج نظر به دست آید به‌شدت نوسان دارد. حداقل اندازه گروه را تعیین کنید.
- **رمزگذاری خراب متن.** نظرهایی که به جای `é` نویسه‌های `Ã©` دارند هر دو روش را گیج می‌کنند؛ نوشته [مشکل حروف فارسی در پایتون: رفع خطای UnicodeDecodeError](/fa/blog/python-unicode-encoding-errors) را ببینید.

## راهنمای انتخاب

| نیاز | پیشنهاد |
|---|---|
| نگاه اولیه و سریع به نظرهای انگلیسی | VADER با امتیازدهی جمله‌به‌جمله |
| نظرها به چند زبان | مدلی چندزبانه که کارتش زبان‌های شما را فهرست کرده باشد |
| امتیاز ستاره‌ای به جای سه برچسب | مدلی آموزش‌دیده روی امتیازهای ستاره‌ای، مانند مدل nlptown |
| بدون GPU و با میلیون‌ها ردیف | VADER، یا یک مدل کوچک با پردازش دسته‌ای و بررسی روی نمونه |
| استفاده تجاری | مجوز مدل را بررسی کنید؛ مدل‌های غیرتجاری را کنار بگذارید |
| عددهایی که به مدیران ارائه می‌کنید | ابتدا 200 تا 500 نظر خودتان را دستی برچسب بزنید و دقت را بسنجید |
| متن پر از طعنه و زبان عامیانه | مدلی آموزش‌دیده روی متن شبکه‌های اجتماعی، به‌علاوه بازبینی انسانی امتیازهای پایین |

## پرسش‌های متداول

### آیا VADER هنوز ارزش استفاده دارد؟

بله، به‌عنوان خط پایه برای متن‌های کوتاه انگلیسی، وقتی به سرعت و نتایجی نیاز دارید که بتوان واژه‌به‌واژه توضیحشان داد. جایی که بافت جمله یا زبان‌های دیگر اهمیت دارند، مدل ترنسفورمر در آزمون ما به‌وضوح بهتر عمل کرد.

### آستانه‌های امتیاز compound در VADER چه معنایی دارند؟

امتیاز `compound` از `-1` تا `+1` است. نویسندگان VADER پیشنهاد می‌کنند `0.05` و بالاتر مثبت، `-0.05` و پایین‌تر منفی و مقادیر میان این دو خنثی در نظر گرفته شود. می‌توانید آستانه‌ها را جابه‌جا کنید، اما آن‌ها را با نمونه‌های برچسب‌خورده تنظیم کنید، نه بر اساس حس.

### آیا برای pipeline در Hugging Face به GPU نیاز دارم؟

خیر. نسخه CPU از torch، 24 نظر ما را در چند ثانیه امتیاز داد. برای صدها هزار نظر، GPU ساعت‌ها صرفه‌جویی می‌کند؛ برای استفاده از آن `device=0` را بدهید.

### کدام مدل برای نظرهای ترکی مناسب است؟

مدل nlptown که اینجا استفاده شد روی ترکی آموزش ندیده است. در هاب Hugging Face مدل‌هایی را جست‌وجو کنید که کارتشان ترکی و داده محصول یا نظر را فهرست کرده باشد، سپس بهترین گزینه‌ها را روی یک نمونه ترکی برچسب‌خورده بیازمایید.

### چطور دقت را روی داده‌های خودم بسنجم؟

یک نمونه تصادفی چندصدتایی از نظرها را خودتان برچسب بزنید و مقایسه کنید. امتیازهای ستاره‌ای، همان‌طور که در این راهنما دیدید، برچسب‌های تقریبی خوبی هستند، اما یک نظر سه‌ستاره اغلب منفی خوانده می‌شود.

### آیا می‌توانم امتیاز احساس را روی نظرهای اسکرپ‌شده به کار ببرم؟

پرسش حقوقی به امتیازدهی مربوط نیست، به جمع‌آوری مربوط است. API رسمی را ترجیح دهید، شرایط استفاده سایت و robots.txt را بررسی کنید و داده‌های شخصی را کنار بگذارید.

## خلاصه

تحلیل احساسات در پایتون به دو انتخاب خلاصه می‌شود. VADER از NLTK کوچک، سریع و قابل توضیح است، اما طعنه، زبان عامیانه، واژه‌های تخصصی هر حوزه و هر زبانی جز انگلیسی را اشتباه می‌خواند. یک مدل Hugging Face بافت جمله را می‌خواند و از چند زبان پشتیبانی می‌کند، به بهای دانلودی حجیم و پردازش بیشتر؛ روی 24 نظر ما در 19 مورد با امتیاز ستاره‌ای هم‌خوان بود، در برابر 14 مورد برای VADER. هر کدام را که انتخاب کنید، امتیازدهی را به یک شیوه ثابت (جمله‌به‌جمله یا نظربه‌نظر) انجام دهید، امتیاز اطمینان را نگه دارید، موارد اختلاف را به یک نفر بسپارید و با نمونه برچسب‌خورده خودتان بسنجید. اگر نظرهای شما از صفحه‌های عمومی در چند کشور می‌آیند، برای جمع‌آوری آن‌ها با نرخی محترمانه [پروکسی‌های Proxynet](/fa/proxy) را ببینید.
