基于TFLearn的情感分析实战:从文本向量化到神经网络构建

基于TFLearn的情感分析实战:从文本向量化到神经网络构建

deep-learning Repo for the Deep Learning Nanodegree Foundations program. deep-learning 项目地址: https://gitcode.com/gh_mirrors/de/deep-learning

前言

情感分析是自然语言处理(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)方法:

  1. 统计所有单词的出现频率
  2. 选择最常用的10000个单词作为词汇表
  3. 将每条评论转换为基于词汇表的向量
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

网络结构说明

  1. 输入层:10000个单元,对应词汇表大小
  2. 隐藏层
    • 第一隐藏层:200个神经元,使用ReLU激活函数
    • 第二隐藏层:25个神经元,使用ReLU激活函数
  3. 输出层:2个神经元,使用softmax激活函数,输出正面/负面的概率
  4. 训练配置
    • 优化器:随机梯度下降(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构建情感分析模型的完整流程:

  1. 数据准备与文本向量化
  2. 词袋模型的构建与实现
  3. TFLearn神经网络的定义与构建
  4. 模型的训练与评估

通过这个实战项目,我们展示了如何将原始文本数据转换为适合神经网络处理的格式,并构建了一个能够有效分类情感倾向的深度学习模型。这种方法可以扩展到其他文本分类任务中,只需调整网络结构和参数即可。

deep-learning Repo for the Deep Learning Nanodegree Foundations program. deep-learning 项目地址: https://gitcode.com/gh_mirrors/de/deep-learning

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钱恺才Grace

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值