一、引言
在当今数字化时代,社交媒体产生了海量的文本数据,这些数据反映了用户的各种情感和观点。对社交媒体数据进行情感分析,能够帮助企业、政府等机构了解公众的态度和情绪,从而做出更明智的决策。本文将使用 Python 结合pandas
、nltk
、sklearn
和tensorflow
等库,对社交媒体数据进行清洗、特征提取,并分别使用随机森林分类器和 LSTM 模型进行情感分析。
二、代码实现
2.1 导入必要的库和设置字体
import pandas as pd
import re
import nltk
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import LabelEncoder
import matplotlib
#
# 指定默认字体
matplotlib.rcParams['font.family'] = 'SimHei' # 或其他支持中文的字体
matplotlib.rcParams['axes.unicode_minus'] = False # 解决负号'-'显示为方块的问题
# 下载 NLP 资源
nltk.download('stopwords')
nltk.download('wordnet')
导入了多个用于数据处理、文本处理、可视化和机器学习的库。设置了matplotlib
的字体和负号显示,同时下载了nltk
所需的自然语言处理资源。
2.2 数据读取与预处理
# 读取 CSV 文件(无列名)
df = pd.read_csv(r'E:\Code\untitled1\机器学习基础训练营\机器学习百例\案例37:基于社交媒体数据的网络舆情分析(情感分析)\train.csv', encoding='latin-1', header=None)
# 手动添加列名
df.columns = ["sentiment", "id", "date", "query", "user", "text"]
# 只保留有用的两列(sentiment 和 text)
df = df[['sentiment', 'text']]
# 显示前几行数据
print(df.head())
# 数据清洗(去除特殊字符、链接、@用户)
def clean_text(text):
text = text.lower() # 转换为小写
text = re.sub(r'http\S+', '', text) # 移除 URL
text = re.sub(r'@\w+', '', text) # 移除 @用户
text = re.sub(r'[^a-zA-Z\s]', '', text) # 仅保留字母
return text
df['cleaned_text'] = df['text'].apply(clean_text)
使用pandas
读取 CSV 文件,由于文件没有列名,手动添加了列名。只保留了sentiment
(情感标签)和text
(文本内容)两列。定义了clean_text
函数对文本进行清洗,包括转换为小写、移除 URL、@用户和非字母字符,并将清洗后的文本存储在新列cleaned_text
中。
2.3 可视化情感分布
# 可视化情感分布
sns.countplot(x=df['sentiment'], palette="viridis")
plt.title("情感分布")
plt.show()
使用seaborn
的countplot
函数绘制情感标签的分布直方图,直观地展示不同情感的数量分布情况。
2.4 特征提取与标签转换
# 使用 TF-IDF 向量化文本
vectorizer = TfidfVectorizer(max_features=5000, stop_words='english')
X = vectorizer.fit_transform(df['cleaned_text'])
# 转换标签
label_encoder = LabelEncoder()
y = label_encoder.fit_transform(df['sentiment'])
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)
使用TfidfVectorizer
将清洗后的文本转换为 TF - IDF 特征矩阵X
,设置最大特征数为 5000 并去除英文停用词。使用LabelEncoder
将情感标签进行编码,得到标签向量y
。将数据集按 90:10 的比例划分为训练集和测试集。
2.5 随机森林分类器训练与评估
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
# 训练随机森林分类器
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 预测结果
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy:.4f}")
创建一个随机森林分类器对象,设置树的数量为 100,并使用训练集数据进行训练。对测试集进行预测,计算预测结果的准确率。
2.6 LSTM 模型训练与评估
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense, SpatialDropout1D
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
# 设定超参数
max_words = 5000
max_len = 100
embedding_dim = 128
# 令 Tokenizer 适配文本数据
tokenizer = Tokenizer(num_words=max_words, oov_token="<OOV>")
tokenizer.fit_on_texts(df['cleaned_text'])
X_seq = tokenizer.texts_to_sequences(df['cleaned_text'])
X_pad = pad_sequences(X_seq, maxlen=max_len, padding='post')
# 训练/测试集划分
X_train, X_test, y_train, y_test = train_test_split(X_pad, y, test_size=0.2, random_state=42)
# 构建 LSTM 模型
model = Sequential([
Embedding(input_dim=max_words, output_dim=embedding_dim, input_length=max_len),
SpatialDropout1D(0.2),
LSTM(128, dropout=0.2, recurrent_dropout=0.2),
Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 训练模型
model.fit(X_train, y_train, epochs=100, batch_size=16, validation_data=(X_test, y_test))
# 评估模型
loss, acc = model.evaluate(X_test, y_test)
print(f"LSTM 模型准确率: {acc:.4f}")
导入tensorflow
相关库,设定了一些超参数,如最大词汇数、最大序列长度和嵌入维度。使用Tokenizer
将文本转换为序列,再使用pad_sequences
对序列进行填充,使其长度一致。将数据集按 80:20 的比例重新划分为训练集和测试集。构建了一个包含嵌入层、空间丢弃层、LSTM 层和全连接层的 LSTM 模型,使用二元交叉熵损失函数和adam
优化器进行编译。训练模型并评估其准确率。
三、结论
通过上述步骤,我们完成了从社交媒体数据的读取、清洗、特征提取到使用随机森林分类器和 LSTM 模型进行情感分析的整个流程。数据清洗能够提高数据质量,TF - IDF 特征提取和词序列转换将文本数据转换为适合模型处理的形式。随机森林分类器和 LSTM 模型分别对情感进行分类预测,并通过准确率评估模型性能。在实际应用中,可以根据具体需求调整模型的超参数,尝试其他特征提取方法或模型结构,以提高情感分析的准确性。同时,还可以结合更多的特征,如文本长度、标点符号使用等,来丰富模型的输入信息。