基于TFLearn的情感分析实战:从文本向量化到神经网络构建
前言
情感分析是自然语言处理(NLP)中的经典任务,旨在判断一段文本表达的情感倾向。本文将详细介绍如何使用TFLearn构建一个神经网络模型,对电影评论进行情感分析(正面/负面)。我们将从数据准备开始,逐步实现文本向量化、神经网络构建和模型训练的全过程。
数据准备
导入必要库
首先导入我们将要使用的Python库:
import pandas as pd
import numpy as np
import tensorflow as tf
import tflearn
from tflearn.data_utils import to_categorical
pandas
用于数据处理numpy
提供高效的数值计算tensorflow
是深度学习框架tflearn
是基于TensorFlow的高级API,简化了神经网络构建过程
读取数据
我们使用两个CSV文件分别存储评论内容和标签:
reviews = pd.read_csv('reviews.txt', header=None)
labels = pd.read_csv('labels.txt', header=None)
数据已经过预处理,所有字符均为小写,这确保了不同大小写的同一单词会被视为相同。
文本向量化
构建词袋模型
我们需要将文本转换为数值向量,这里采用词袋模型(Bag of Words)方法:
- 统计所有单词的出现频率
- 选择最常用的10000个单词作为词汇表
- 将每条评论转换为基于词汇表的向量
from collections import Counter
total_counts = Counter()
for _, row in reviews.iterrows():
total_counts.update(row[0].split(' '))
print("Total words in data set: ", len(total_counts))
构建词汇表
选择出现频率最高的10000个单词:
vocab = sorted(total_counts, key=total_counts.get, reverse=True)[:10000]
词汇表中最后一个单词大约出现在30条评论中,占总评论数的0.12%,说明10000的词汇量是合理的。
创建词到索引的映射
word2idx = {word: i for i, word in enumerate(vocab)}
文本到向量转换函数
def text_to_vector(text):
word_vector = np.zeros(len(vocab), dtype=np.int_)
for word in text.split(' '):
idx = word2idx.get(word, None)
if idx is None:
continue
else:
word_vector[idx] += 1
return np.array(word_vector)
这个函数将输入文本转换为一个10000维的向量,每个元素表示对应单词在文本中出现的次数。
数据预处理
转换所有评论
word_vectors = np.zeros((len(reviews), len(vocab)), dtype=np.int_)
for ii, (_, text) in enumerate(reviews.iterrows()):
word_vectors[ii] = text_to_vector(text[0])
划分训练集和测试集
Y = (labels=='positive').astype(np.int_)
records = len(labels)
shuffle = np.arange(records)
np.random.shuffle(shuffle)
test_fraction = 0.9
train_split, test_split = shuffle[:int(records*test_fraction)], shuffle[int(records*test_fraction):]
trainX, trainY = word_vectors[train_split,:], to_categorical(Y.values[train_split, 0], 2)
testX, testY = word_vectors[test_split,:], to_categorical(Y.values[test_split, 0], 2)
使用to_categorical
将标签转换为one-hot编码形式,适合softmax分类。
构建神经网络模型
TFLearn提供了高级API来简化神经网络构建过程。我们将构建一个包含输入层、隐藏层和输出层的网络。
模型构建函数
def build_model():
# 重置所有参数和变量
tf.reset_default_graph()
# 输入层 - 10000个输入单元对应词汇表大小
net = tflearn.input_data([None, 10000])
# 隐藏层
net = tflearn.fully_connected(net, 200, activation='ReLU')
net = tflearn.fully_connected(net, 25, activation='ReLU')
# 输出层 - 2个单元对应正面/负面分类
net = tflearn.fully_connected(net, 2, activation='softmax')
# 定义训练方法
net = tflearn.regression(net, optimizer='sgd',
learning_rate=0.1,
loss='categorical_crossentropy')
# 创建DNN模型
model = tflearn.DNN(net)
return model
网络结构说明
- 输入层:10000个单元,对应词汇表大小
- 隐藏层:
- 第一隐藏层:200个神经元,使用ReLU激活函数
- 第二隐藏层:25个神经元,使用ReLU激活函数
- 输出层:2个神经元,使用softmax激活函数,输出正面/负面的概率
- 训练配置:
- 优化器:随机梯度下降(SGD)
- 学习率:0.1
- 损失函数:分类交叉熵
模型训练与评估
初始化模型
model = build_model()
训练模型
model.fit(trainX, trainY, validation_set=0.1, show_metric=True, batch_size=128, n_epoch=50)
训练过程中,TFLearn会自动划分10%的训练数据作为验证集,用于监控模型性能。
评估模型
predictions = (np.array(model.predict(testX))[:,1] >= 0.5).astype(np.int_)
test_accuracy = np.mean(predictions == testY[:,1], axis=0)
print("Test accuracy: ", test_accuracy)
总结
本文详细介绍了使用TFLearn构建情感分析模型的完整流程:
- 数据准备与文本向量化
- 词袋模型的构建与实现
- TFLearn神经网络的定义与构建
- 模型的训练与评估
通过这个实战项目,我们展示了如何将原始文本数据转换为适合神经网络处理的格式,并构建了一个能够有效分类情感倾向的深度学习模型。这种方法可以扩展到其他文本分类任务中,只需调整网络结构和参数即可。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考