Analiza sentimentului în recenzii de produse folosind NLP și BERT

Configurare noua (How To)

Situatie

Analiza sentimentului presupune clasificarea automată a opiniilor exprimate în text, în categorii precum: pozitiv, negativ sau neutru. Este vitală pentru companii care vor să înțeleagă:

  • Ce spun clienții despre produsele lor

  • Ce probleme apar recurent

  • Cum variază satisfacția în timp.

Solutie

Alegerea unui model NLP

Modelele clasice (TF-IDF + Logistic Regression) au fost depășite de modelele de tip transformer, cum ar fi:

  • BERT (Bidirectional Encoder Representations from Transformers)

  • RoBERTa, DistilBERT – versiuni optimizate ale BERT

Acestea înțeleg mai bine contextul cuvintelor într-un text și pot atinge acurateți > 90%.

Set de date folosit

Vom folosi un dataset real de recenzii de produse Amazon (sau IMDB), cu coloanele:

Coloană Descriere
review Textul recenziei
sentiment Eticheta: pozitiv / negativ

Pași de implementare

Pasul 1: Instalare și setup

pip install transformers datasets torch scikit-learn pandas matplotlib

 Pasul 2: Încărcare set de date

from datasets import load_dataset
dataset = load_dataset("imdb") # alternativ: amazon_polarity

Pasul 3: Tokenizare cu tokenizer-ul BERT

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

def tokenize(example):
return tokenizer(example['text'], padding="max_length", truncation=True)

tokenized_dataset = dataset.map(tokenize, batched=True)

Pasul 4: Antrenare model BERT pentru clasificare

from transformers import BertForSequenceClassification, Trainer, TrainingArguments

model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)

training_args = TrainingArguments(
output_dir="./results",
evaluation_strategy="epoch",
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
num_train_epochs=2,
)

trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset["train"].shuffle(seed=42).select(range(2000)),
eval_dataset=tokenized_dataset["test"].select(range(1000)),
)

trainer.train()

Pasul 5: Evaluarea performanței

results = trainer.evaluate()
print(results)

Se pot atinge valori de accuracy peste 90% cu doar câteva mii de exemple și fine-tuning minim.

Aplicare practică: clasificare în timp real

Clasificare a unui text nou:

from transformers import pipeline

classifier = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)
classifier("Produsul a fost extraordinar, livrare rapidă și calitate excelentă!")
# ➜ [{'label': 'POSITIVE', 'score': 0.98}]

Vizualizare: sentimente per produs sau categorie

import matplotlib.pyplot as plt

# Exemplu: calculăm procentul de recenzii pozitive pe produs
product_reviews = [...] # lista de review-uri pe un produs
results = [classifier(r)[0]['label'] for r in product_reviews]

positive_ratio = results.count('POSITIVE') / len(results)
plt.bar(['Pozitiv', 'Negativ'], [positive_ratio, 1 - positive_ratio])
plt.title("Sentiment - Produs X")
plt.show()

Îmbunătățiri posibile

Îmbunătățire Detalii
Multi-class sentiment pozitiv / negativ / neutru / furios / ironic
Model localizat BERT în română: dumitrescustefan/bert-base-romanian-cased-v1
Feedback time-based analiză evolutivă a sentimentului
Explainability interpretarea scorului folosind LIME/SHAP

Tip solutie

Permanent

Voteaza

(2 din 9 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?