Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации



Анализ тональности текста — это способ заставить компьютер «прочитать» сообщение и понять, насколько он положительный, отрицательный или нейтральный. Вы научитесь:
Эти навыки нужны в маркетинге (отзывы о товаре), в образовании (анализ эссе), в поддержке пользователей (автоматическое распределение запросов) и во многих других областях.
| Термин | Описание | Пример |
|---|---|---|
| Тональность | Оценка эмоционального окраса текста (положительный / отрицательный / нейтральный) | «Отличный сервис!» — положительный |
| Лексикон | Словарь, где каждому слову сопоставлен вес (положительный/отрицательный) | AFINN, SentiWordNet |
| Токенизация | Разделение строки на отдельные «токены» (слова, суб‑слова, символы) | «Привет, мир!» → [«Привет», «,», «мир», «!»] |
| Стоп‑слова | Часто встречающиеся слова, не несущие смысловой нагрузки | «и», «в», «на» |
| Векторизация | Преобразование токенов в числовой вектор (bag‑of‑words, TF‑IDF, эмбеддинги) | «молодой» → [0,0,1,0,…] |
| Классификатор | Алгоритм, который на основе вектора предсказывает тональность | Logistic Regression, BERT |
| Метрика | Способ измерения качества модели (accuracy, F1‑score) | accuracy = 0.85 |
re.sub(r'<.*?>', '', text) text.lower() (если язык чувствителен к регистру) str.translate(str.maketrans('', '', string.punctuation)) pymorphy2, для английского: nltk.stem.PorterStemmer) Аналогия: очистка текста — как подготовка овощей перед готовкой: сначала моете, потом нарезаете, а потом удаляете лишние части.
from nltk.tokenize import word_tokenize
tokens = word_tokenize(text, language='russian')
from nltk.corpus import stopwords
stop = set(stopwords.words('russian'))
tokens = [t for t in tokens if t not in stop]
| Метод | Принцип | Плюсы | Минусы |
|---|---|---|---|
| Bag‑of‑Words (BoW) | Счёт частоты слов | Простой, быстрый | Игнорирует порядок |
| TF‑IDF | Частота умноженная на обратную документную частоту | Уменьшает вес часто встречающихся слов | Всё ещё без контекста |
| Word2Vec / GloVe | Слово → вектор фиксированной длины, обученный на большом корпусе | Сохраняет семантику | Требует большого объёма данных |
| BERT‑style embeddings | Контекстные вектора, учитывающие соседние слова | Самый точный | Дорого в вычислениях |
def sentiment_score(tokens, lexicon):
score = 0
for t in tokens:
score += lexicon.get(t, 0) # 0, если слова нет в словаре
return score
Плюсы: быстро, не требует обучения.
Минусы: не учитывает контекст (слово «не» может полностью менять смысл).
Пример: «не хороший» → словарь даст +1 за «хороший», но без учёта частицы «не» получим ошибочный положительный результат.
| Алгоритм | Признаки | Пример использования |
|---|---|---|
| Naïve Bayes | TF‑IDF, n‑grams | Быстрый baseline |
| Logistic Regression | TF‑IDF, частерные n‑grams | Хорошо работает на небольших датасетах |
| Support Vector Machine | TF‑IDF, хеш‑векторы | Высокая точность при правильной настройке |
| Random Forest | TF‑IDF, дополнительные метки (длина текста, наличие эмодзи) | Интересен для объяснимости |
Пайбор:
X. train_test_split). model.fit(X_train, y_train)). model.predict(X_test)). from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
vectorizer = TfidfVectorizer(ngram_range=(1,2), min_df=2)
X = vectorizer.fit_transform(texts)
y = labels
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
clf = LogisticRegression(max_iter=1000)
clf.fit(X_train, y_train)
pred = clf.predict(X_test)
print(classification_report(y_test, pred))
| Модель | Архитектура | Преимущества | Пример кода |
|---|---|---|---|
| CNN for Text | Сверточные слои + pooling | Выявляет локальные паттерны (фразы) | nn.Conv1d в PyTorch |
| RNN / LSTM | Последовательные слои | Учитывает порядок слов | nn.LSTM |
| Transformer (BERT, RoBERTa, DistilBERT) | Само‑внимание | Контекстные эмбеддинги, лучшая точность | transformers library |
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
model_name = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
def predict_sentiment(text):
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=128)
with torch.no_grad():
logits = model(**inputs).logits
prob = torch.nn.functional.softmax(logits, dim=-1)
label = torch.argmax(prob, dim=1).item()
return "positive" if label == 1 else "negative", prob.squeeze().tolist()
Почему BERT лучше?
class_weight='balanced' или oversampling. | Метрика | Что измеряется | Как считать |
|---|---|---|
| Accuracy | Доля правильных предсказаний | (TP+TN)/(TP+TN+FP+FN) |
| Precision | Доля действительно положительных среди предсказанных положительных | TP/(TP+FP) |
| Recall | Доля найденных положительных среди всех реальных положительных | TP/(TP+FN) |
| F1‑score | Гармоническое среднее precision и recall | 2·(P·R)/(P+R) |
| ROC‑AUC | Площадь под кривой ROC (для бинарной классификации) | sklearn.metrics.roc_auc_score |
Для мультиклассовой задачи (положительно/отрицательно/нейтрально) удобно использовать macro‑averaged F1‑score, который не зависит от дисбаланса классов.
| Сфера | Пример задачи | Как использовать |
|---|---|---|
| Маркетинг | Автоматический анализ отзывов о продукте | Словарный метод для быстрых проверок, BERT для детального анализа |
| Образование | Оценка эмоционального тона эссе студента | LSTM‑модель, обученная на школьных текстах |
| Поддержка клиентов | Приоритизация запросов (негативные → срочно) | Классификатор на основе TF‑IDF + Logistic Regression |
| Социальные сети | Мониторинг общественного мнения о событии | Streaming‑pipeline с BERT‑моделью, обновляемой каждые 24 ч |
| Проблема | Почему возникает | Как решить |
|---|---|---|
| Ирония / сарказм | Текст выглядит положительным, но смысл отрицательный | Добавить обучающие примеры с сарказмом, использовать модели, обученные на таких датасетах (например, Twitter‑Sarcasm) |
| Доменные термины | Словарь не знает специфических слов («криптовалюта», «мем») | Обучить собственный Word2Vec/fastText на доменной коллекции, добавить новые слова в лексикон |
| Краткие сообщения | Недостаточно контекста для точного предсказания | Использовать эмодзи и пунктуацию как дополнительные признаки |
| Перекос (bias) | Данные содержат предвзятость (например, гендерные стереотипы) | Проверять fairness‑метрики, сбалансировать датасет, применять debiasing‑техники |
Токенизация и очистка
tokens. Словарный расчёт баланса
sentiment_score(tokens, lexicon), которая возвращает итоговый балл. Обучение простого Logistic Regression
LogisticRegression. accuracy и macro‑F1. Fine‑tuning BERT
transformers. distilbert-base-uncased-finetuned-sst-2-english. Анализ ошибок
Поздравляю! Вы прошли от базовой очистки текста до современного BERT‑классификатора, научились измерять его эффективность и знать, где скрываются подводные камни. Теперь вы готовы внедрять анализ тональности в любые проекты — от чат‑ботов до систем рекомендаций. Удачной практики!