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,负面词 -1
- 最终根据计数器值判断情感倾向:
- 正值 → 正面
- 负值 → 负面
- 零值 → 中性
✅ 优点:简单快速
❌ 缺点:忽略语义和上下文,无法处理基于方面的分析,工业界很少使用
4.2. 监督学习方法(Supervised Approach)
这是目前最主流、工业级应用最广泛的方法。依赖于带标注的数据集,即包含文本和对应情感标签的数据。
典型流程如下:
- 文本预处理(分词、词干提取、停用词过滤)
- 文本向量化(如 TF-IDF)
- 使用机器学习模型训练(如 Naive Bayes、SVM、深度学习模型)
- 模型评估与调优
✅ 优点:准确率高,适应复杂场景
❌ 缺点:依赖大量标注数据
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 实现案例,使用监督学习进行三分类情感分析
如果你正在构建用户反馈分析系统、舆情监控平台或产品评论聚合系统,情感分析是一个非常值得掌握的技术。在实际开发中,建议优先考虑监督学习方法,并结合业务场景进行调优。