1. 概述

在本教程中,我们将介绍情感分析的基本概念。首先了解情感和情感分析的定义,然后讨论情感分析的类型和常用算法。

最后,我们会演示一个使用 Python 实现的监督学习情感分析案例。

2. 什么是情感分析?

2.1. 情感的定义

情感是指对某人或某事的态度、情绪或感觉。通常表现为评论或观点,具有正面或负面倾向。

例如,当有人说:“我不喜欢 Android OS 的最新版本”,这表明他对该版本持负面看法。

2.2. 情感分析的定义

情感分析是指使用自然语言处理(NLP)、计算语言学、机器学习和统计学的算法和工具,来判断文本中的情感倾向。也被称为意见挖掘或情绪分析。

基本的情感分类包括正面和负面。只处理这两种情况称为二分类情感分析。

有些场景还会加入中性类别,构成三分类问题。中性类别用于表达事实、新闻、宗教文本等无明显情绪的语句,例如:“新冠确诊病例正在上升”就是一个中性陈述。

随着神经网络和深度学习的发展,情感分析也开始引入更细致的类别,如愤怒、悲伤、恐惧、喜悦和惊讶。

在本教程中,我们聚焦于基础的三分类:正面、负面、中性

2.3. 应用场景

情感分析最常见的商业用途包括:

  • 监控社交媒体上的用户评论
  • 分析产品和酒店评价
  • 非数值型的股市情绪分析

这些帮助制造企业、服务提供商和公众人物更主动地了解公众意见。

比如,Expedia 加拿大分公司在 2017 年就通过情感分析发现,某电视广告的背景音乐引发了负面反馈,从而及时做出调整。

3. 情感分析的类型

3.1. 主观性识别(Subjectivity Identification)

该类型的目标是判断给定文本的情感类别。文本通常为一句话、推文或短段落。

例如:

  • “真遗憾,我的航班取消了” → 负面
  • “我很享受骑这辆新电动滑板车” → 正面

3.2. 基于方面的情感分析(Aspect-Based)

该类型中,同一对象的不同方面可能带有不同情感

举个例子:

“用了一年这台手机,我觉得屏幕是全高清非常棒,电池也很耐用,但相机在弱光下表现很差。”

这段评论中提到了三个不同方面:屏幕(正面)、电池(正面)、相机(负面)。

这种分析常用于产品和酒店评论。由于不同方面的情感不一致,难以得出整体情感倾向。

4. 情感分析方法

4.1. 基于词典的方法(Lexicon-Based Approach)

使用预定义的情感词典(包含正面词和负面词)进行判断。

流程如下:

  1. 将文本拆分为单词
  2. 匹配词典中的情感词
  3. 设置一个计数器:遇到正面词 +1,负面词 -1
  4. 最终根据计数器值判断情感倾向:
    • 正值 → 正面
    • 负值 → 负面
    • 零值 → 中性

优点:简单快速
缺点:忽略语义和上下文,无法处理基于方面的分析,工业界很少使用

4.2. 监督学习方法(Supervised Approach)

这是目前最主流、工业级应用最广泛的方法。依赖于带标注的数据集,即包含文本和对应情感标签的数据。

典型流程如下:

  1. 文本预处理(分词、词干提取、停用词过滤)
  2. 文本向量化(如 TF-IDF)
  3. 使用机器学习模型训练(如 Naive Bayes、SVM、深度学习模型)
  4. 模型评估与调优

优点:准确率高,适应复杂场景
缺点:依赖大量标注数据

4.3. 混合方法(Hybrid Approach)

结合词典法与监督学习法,先用监督学习预测,再用词典法进行验证。

⚠️ 适用于三分类问题,不适用于更细粒度的情感分类。

5. 实战:使用 Python 进行情感分析

我们使用“US Airline Tweets”数据集,演示一个完整的监督学习情感分析流程。

✅ 示例代码

import pandas as pd
import re
from sklearn import metrics
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import MultinomialNB
import random
import sklearn.model_selection as model_selection

# 加载数据
tweets_df = pd.read_csv('us_airline_tweets.csv')

# 查看数据结构和缺失值
print(tweets_df.info())

# 保留需要的字段并去重
tweets_df.drop(tweets_df.columns.difference(['airline_sentiment', 'text']), 1, inplace=True)
tweets_df.drop_duplicates(inplace=True)
print(tweets_df.isnull().sum())

# 文本清洗
tweets_df['text'] = tweets_df['text'].apply(lambda x: re.sub(r"(www|http|https|pic)([a-zA-Z\.0-9:=\\~#/_\&%\?\-])*", ' ', x))
tweets_df['text'] = tweets_df['text'].apply(lambda x: x.replace('@', ''))
tweets_df['text'] = tweets_df['text'].apply(lambda x: x.replace('#', ''))
tweets_df['text'] = tweets_df['text'].apply(lambda x: x.lower())

# 划分训练集和测试集
X_train, X_test, y_train, y_test = model_selection.train_test_split(
    tweets_df['text'],
    tweets_df['airline_sentiment'],
    train_size=0.80,
    test_size=0.20,
    random_state=101
)

# 构建处理流程
pipeline = Pipeline([
    ('vect', TfidfVectorizer(min_df=0.0001, max_df=0.95, analyzer='word', lowercase=True, ngram_range=(1, 3), stop_words='english')),
    ('clf', MultinomialNB()),
])

# 训练模型
pipeline.fit(X_train, y_train)

# 预测与评估
y_predicted = pipeline.predict(X_test)

# 输出分类报告
print(metrics.classification_report(y_test, y_predicted))

# 输出特征数量及示例
feature_names = pipeline.named_steps['vect'].get_feature_names()
print('# of features:', len(feature_names))
print('sample of features:', random.sample(feature_names, 40))

# 输出评估指标
accuracy = accuracy_score(y_test, y_predicted)
precision = precision_score(y_test, y_predicted, average='weighted')
recall = recall_score(y_test, y_predicted, average='weighted')
f1 = f1_score(y_test, y_predicted, average='weighted')

print('Accuracy: ', "%.2f" % (accuracy*100))
print('Precision: ', "%.2f" % (precision*100))
print('Recall: ', "%.2f" % (recall*100))
print('F1: ', "%.2f" % (f1*100))

📊 输出结果

执行上述脚本后,会输出如下评估指标:

Accuracy:  69.60
Precision: 72.80
Recall:    69.60
F1:        63.07

⚠️ 这些结果在工业级应用中并不算高,但足以说明监督学习的基本流程。通过优化文本预处理、特征提取和模型调参,可以显著提升效果。

6. 总结

在本教程中,我们讲解了:

  • 情感分析的定义与应用场景
  • 不同类型的情感分析(主观识别 vs 基于方面)
  • 常见情感分析方法(词典法、监督学习、混合方法)
  • 一个完整的 Python 实现案例,使用监督学习进行三分类情感分析

如果你正在构建用户反馈分析系统、舆情监控平台或产品评论聚合系统,情感分析是一个非常值得掌握的技术。在实际开发中,建议优先考虑监督学习方法,并结合业务场景进行调优。


原始标题:Algorithms for Determining Text Sentiment