自然语言处理NLP TextRNN实现情感分类

目录
  • 概要
  • 数据集
  • 数据预处理
  • 模型构建
  • 模型训练
  • 模型评估
  • 结论

概要

在自然语言处理(NLP)领域,情感分析及分类是一项十分热门的任务。它的目标是从文本中提取出情感信息和意义,通常分为两类:正向情感和负向情感,并且可以细化为多个情感级别。

在这篇文章中,我们将介绍如何使用TextRNN(Text Recurrent Neural Network)来实现情感短文本分类任务。我们将探索数据预处理、模型构建、训练和评估等主题。

数据集

我们将使用公开的中文情感分类数据集THUCNews。该数据集包括74000个样本,被标记成10个类别:'体育', '娱乐', '家居', '房产', '教育', '时尚', '时政', '游戏', '科技'和 '财经'。我们选择其中5类并按照“csv”格式存储下来:'体育', '时政', '科技', '娱乐'和‘财经’。每个样本由一条短文本和一个标签组成。

以下是读取数据集和预览样本:

import pandas as pd
# 加载数据集
df = pd.read_csv('data.csv')
# 打印前五个样本
print(df.head())

输出:

label text
0 3 华彩行动到了20位担保人 全国民间组织网络代表共襄盛举
1 4 中移动前4月新用户净增955万用户
2 1 浙江教育房贷减轻购房压力 师生建体制
3 1 中央党校党的历史研究院原副院长林必胜先生逝世
4 1 中央党校党的历史研究院实现640家文博单位军工企业4000余名干部学习实践十八大精神

数据预处理

首先,将文本转换为可供模型使用的数字特征向量是自然语言处理任务中的关键步骤。我们可以通过利用一种称为“分词”的技术,将文本划分为一个个单词或词汇。

对于中文文本,我们将使用jieba分词库。以下是代码实现:

import jieba
# 进行中文分词,并将结果以字符串列表形式返回
def chinese_word_cut(mytext):
    return ' '.join(jieba.cut(mytext))
df['text'] = df.text.apply(chinese_word_cut)

接下来,我们需要将文本数据转换为数值特征向量。我们可以使用torchtext库来处理此操作。以下是代码实现:

import torchtext
from torchtext import data
# 构建Field和Dataset
text_field = data.Field(tokenize='spacy', batch_first=True, fix_length=100)
label_field = data.LabelField(dtype=torch.long)
fields = [('text', text_field), ('label', label_field)]
dataset = data.TabularDataset(path='data.csv',
                              format='csv',
                              fields=fields,
                              skip_header=True)
# 划分测试集与训练集,比例为0.8/0.2
train_data, test_data = dataset.split(split_ratio=0.8, random_state=random.getstate())
# 构建词典
text_field.build_vocab(train_data, vectors='glove.6B.100d')
label_field.build_vocab(train_data)

在这里,我们定义两个Field:第一个用于表示问题文本,第二个用于表示标签。然后,我们将它们放到一个名为“fields”的列表里。数据的格式是CSV,并由TabularDataset加载。

接着,我们对原始数据进行划分,将80%的数据作为训练集,20%作为测试集。为了能再次处理相同的数据,我们还设置了一个种子(random state)。

最后,我们创建了单词表,并利用预训练的词向量(fill-vectors)进行初始化。例如,在此处,我们选择了GloVe词向量(glove.6B.100d)。GloVe是一种基于全局词频的词向量。

模型构建

TextRNN 是一个典型的循环神经网络模型,专门用于处理序列数据。当我们连续阅读一篇文章时,记忆通常从前到后流动,并且在阅读新的单词时,信息会累积起来,这正是RNN的目标。

我们将使用PyTorch来实现一个简单的TextRNN模型。以下是代码实现:

import torch.nn as nn
class TextRNN(nn.Module):
    def __init__(self, vocab_size, embed_dim, hidden_dim, output_dim, n_layers,
                 bidirectional, dropout):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embed_dim)
        self.hidden_dim = hidden_dim
        self.n_layers = n_layers
        self.bidirectional = bidirectional
        self.rnn = nn.RNN(embed_dim,
                          hidden_dim,
                          num_layers=n_layers,
                          bidirectional=bidirectional,
                          batch_first=True,
                          dropout=dropout)
        self.fc = nn.Linear(hidden_dim * 2 if bidirectional else hidden_dim, output_dim)
        self.dropout = nn.Dropout(dropout)
    def forward(self, text):
        embedded = self.embedding(text)
        output, hidden = self.rnn(embedded)
        hidden = self.dropout(torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim = 1))
        return self.fc(hidden)

在RNN层之后有两个线性层:一个用于投影输出空间,一个用于产生最终结果。为了避免过拟合,我们还添加了一些丢弃层。

此处的输入特征为嵌入(embedding)矩阵,该矩阵是固定大小的,其中每行对应于词汇表中的单个单词。所以第一个参数为vocab_size, 第二个参数用于指定分词后每个单词的维度。

RNN的隐藏状态(h)对于这类任务非常关键,因为它是从之前的时间步的信息生成的,并存储了读取所有历史记录的能力。在我们的示例中,我们选用GPU加速训练。

模型训练

现在我们准备好训练模型了。我们将使用PyTorch Lightning框架来加速开发和调试的过程。

以下是代码实现:

import torch
from torch.utils.data import DataLoader
import pytorch_lightning as pl
class Model(pl.LightningModule):
    def __init__(self, vocab_size, embed_dim, hidden_dim, output_dim, n_layers,
                 bidirectional, dropout=0.5):
        super(Model, self).__init__()
        self.rnn = TextRNN(vocab_size, embed_dim, hidden_dim,
                           output_dim, n_layers, bidirectional, dropout)
        self.loss_fn = nn.CrossEntropyLoss()
    def forward(self, text):
        return self.rnn(text)
    def training_step(self, batch, batch_idx):
        x, y = batch.text, batch.label
        pred_y = self(x).squeeze(1)
        loss = self.loss_fn(pred_y, y)
        acc = accuracy(pred_y, y)
        self.log('train_loss', loss, prog_bar=True)
        self.log('train_acc', acc, prog_bar=True)
        return {'loss': loss}
    def validation_step(self, batch, batch_idx):
        x, y = batch.text, batch.label
        pred_y = self(x).squeeze(1)
        loss = self.loss_fn(pred_y, y)
        acc = accuracy(pred_y, y)
        self.log('val_loss', loss, prog_bar=True)
        self.log('val_acc', acc, prog_bar=True)
    def configure_optimizers(self):
        optimizer = torch.optim.Adam(self.parameters(), lr=0.001)
        return optimizer
def accuracy(preds, y):
    _, preds = torch.max(preds, dim=1)
    correct = (preds == y).float()
    acc = correct.sum() / len(correct)
    return acc

这里我们使用LightningModule来创建一个PyTorch Lightning模型。在训练步骤中,我们计算了损失和准确率,并将值记录为train_losstrain_accval_loss val_acc。然后我们返回损失并将PyTorch Lightning接收到的优化器作为return语句输出。

模型评估

现在我们已经完成了训练,下一步是评估我们的模型。我们将使用测试集进行评估。以下是代码实现:

test_loader = DataLoader(test_data, batch_size=BATCH_SIZE)
ckpt = pl.callbacks.ModelCheckpoint(monitor='val_loss')
trainer = pl.Trainer(gpus=1, callbacks=[ckpt])
model = Model(len(text_field.vocab), 100, 128, len(label_field.vocab), 1, True)
trainer.fit(model, DataLoader(train_data, batch_size=BATCH_SIZE))
trainer.test(test_dataloaders=test_loader)

在这里,我们将batch size设置为128,并训练20个epoch。最后,使用测试数据评估模型的性能。

结论

在本文章中,我们介绍了如何使用TextRNN模型来实现短文本情感分类任务。我们使用PyTorch和PyTorch Lightning库建立、训练和评估模型。

虽然我们主要关注情感分类任务,但这些方法本质上可以应用于其他NLP问题。

以上就是自然语言处理NLP TextRNN实现情感分类的详细内容,更多关于NLP TextRNN情感分类的资料请关注我们其它相关文章!

(0)

相关推荐

  • nlp自然语言处理学习CBOW模型类实现示例解析

    目录 实现CBOW模型类 Trainer类的实现 实现CBOW模型类 初始化:初始化方法的参数包括词汇个数 vocab_size 和中间层的神经元个数 hidden_size.首先生成两个权重(W_in 和 W_out),并用一些小的随机值初始化这两个权重.设置astype(‘f’),初始化将使用 32 位的浮点数. 生成层:生成两个输入侧的 MatMul 层.一个输出侧的 MatMul 层,以及一个 Softmax with Loss 层. 保存权重和梯度:将该神经网络中使用的权重参数和梯度分

  • nlp自然语言处理基于SVD的降维优化学习

    目录 基于SVD的降维优化 SVD的直观意义 基于SVD的降维优化 向量降维:尽量保留数据“重要信息”的基础上减少向量维度.可以发现重要的轴(数据分布广的轴),将二维数据 表示为一维数据,用新轴上的投影值来表示各个数据点的值,示意图如下. 稀疏矩阵和密集矩阵转换:大多数元素为0的矩阵称为稀疏矩阵,从稀疏矩阵中找出重要的轴,用更少的维度对其进行重新表示.结果,稀疏矩阵就会被转化为大多数元素均不为0的密集矩阵.这个密集矩阵就是我们想要的单词的分布式表示. 奇异值分解(Singular Value D

  • Python PaddleNLP信息抽取提取快递单信息

    目录 5 条标注数据,搞定物流快递单信息抽取 智能立体库盘点 近几年,制造业作为国民经济主体,是国家创造力.竞争力和综合国力的重要体现.作为制造强国建设的主攻方向,可以说,智能制造发展水平关乎我国未来制造业的全球地位. 制造业与物流结合紧密,随着制造业的高速发展,对自动化率.全产业链协同和生产效率再提高等方向均提出了更高的要求,需要物流仓储能够匹配相应的生产节奏. 同时,据统计,我国制造业生产成本中,物流占比高达三成,降低物流成本成为了制造业利润提升的关键一环. 今天,我将基于智能制造 - 精益

  • nlp计数法应用于PTB数据集示例详解

    目录 PTB数据集 ptb.py 使用ptb.py 计数方法应用于PTB数据集 PTB数据集 内容如下: 一行保存一个句子:将稀有单词替换成特殊字符 < unk > :将具体的数字替换 成“N” we 're talking about years ago before anyone heard of asbestos having any questionable properties there is no asbestos in our products now neither <

  • PaddleNLP ppdiffusers 自动生成兔了个兔海报

    目录 欢欢喜喜辞旧岁 下载PaddleNLP 安装PaddleNLP 重启notebook 安装ppdiffusers diffusion文图生成 选定diffusion模型 图片生成 海报合成 查看海报 欢欢喜喜辞旧岁 辞旧迎新之际,来 AI Studio 一起 #欢喜迎兔年# !分享不同新年风俗,共享一段快乐时光! p>下面就开始我们的海报之旅 下载PaddleNLP from IPython.display import clear_output %cd ~ !git clone -b d

  • Python机器学习NLP自然语言处理基本操作之京东评论分类

    目录 概述 RNN 权重共享 计算过程 LSTM 阶段 数据介绍 代码 预处理 主函数 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. RNN RNN (Recurrent Neural Network), 即循环神经网络. RNN 相较于 CNN, 可以帮助我们更好的处理序列信息, 挖掘前后信息之间的联系. 对于 NLP 这类的任务, 语料的前后概率有极大的联系. 比如: "明天

  • 基于循环神经网络(RNN)实现影评情感分类

    使用循环神经网络(RNN)实现影评情感分类 作为对循环神经网络的实践,我用循环神经网络做了个影评情感的分类,即判断影评的感情色彩是正面的,还是负面的. 选择使用RNN来做情感分类,主要是因为影评是一段文字,是序列的,而RNN对序列的支持比较好,能够"记忆"前文.虽然可以提取特征词向量,然后交给传统机器学习模型或全连接神经网络去做,也能取得很好的效果,但只从端对端的角度来看的话,RNN无疑是最合适的. 以下介绍实现过程. 一.数据预处理 本文中使用的训练数据集为https://www.c

  • Tensorflow2.1实现文本中情感分类实现解析

    目录 前言 实现过程和思路解析 下载影评数据并进行 padding 处理 创建验证集数据 搭建简单的深度学习模型 配置并编译模型 训练模型 评估模型 前言 本文主要是用 cpu 版本的 tensorflow 2.1 搭建深度学习模型,完成对电影评论的情感分类任务. 本次实践的数据来源于IMDB 数据集,里面的包含的是电影的影评,每条影评评论文本分为积极类型或消极类型.数据集总共包含 50000 条影评文本,取该数据集的 25000 条影评数据作为训练集,另外 25000 条作为测试集,训练集与测

  • Python机器学习NLP自然语言处理基本操作新闻分类

    目录 概述 TF-IDF 关键词提取 TF IDF TF-IDF TfidfVectorizer 数据介绍 代码实现 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. TF-IDF 关键词提取 TF-IDF (Term Frequency-Inverse Document Frequency), 即词频-逆文件频率是一种用于信息检索与数据挖掘的常用加权技术. TF-IDF 可以帮助我

  • Python机器学习NLP自然语言处理基本操作词向量模型

    目录 概述 词向量 词向量维度 Word2Vec CBOW 模型 Skip-Gram 模型 负采样模型 词向量的训练过程 1. 初始化词向量矩阵 2. 神经网络反向传播 词向量模型实战 训练模型 使用模型 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 词向量 我们先来说说词向量究竟是什么. 当我们把文本交给算法来处理的时候, 计算机并不能理解我们输入的文本, 词向量就由此而生了.

  • Python机器学习NLP自然语言处理基本操作家暴归类

    目录 概述 数据介绍 词频统计 朴素贝叶斯 代码实现 预处理 主函数 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 数据介绍 该数据是家庭暴力的一份司法数据.分为 4 个不同类别: 报警人被老公打,报警人被老婆打,报警人被儿子打,报警人被女儿打. 今天我们就要运用我们前几次学到的知识, 来实现一个 NLP 分类问题. 词频统计 CountVectorizer是一个文本特征提取的方

  • Python机器学习NLP自然语言处理基本操作关键词

    目录 概述 关键词 TF-IDF 关键词提取 TF IDF TF-IDF jieba TF-IDF 关键词抽取 jieba 词性 不带关键词权重 附带关键词权重 TextRank 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 关键词 关键词 (keywords), 即关键词语. 关键词能描述文章的本质, 在文献检索, 自动文摘, 文本聚类 / 分类等方面有着重要的应用. 关键词抽

  • Python机器学习NLP自然语言处理基本操作电影影评分析

    目录 概述 RNN 权重共享 计算过程 LSTM 阶段 代码 预处理 主函数 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. RNN RNN (Recurrent Neural Network), 即循环神经网络. RNN 相较于 CNN, 可以帮助我们更好的处理序列信息, 挖掘前后信息之间的联系. 对于 NLP 这类的任务, 语料的前后概率有极大的联系. 比如: "明天天气真好&

  • Python机器学习NLP自然语言处理基本操作词袋模型

    概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 词袋模型 词袋模型 (Bag of Words Model) 能帮助我们把一个句子转换为向量表示. 词袋模型把文本看作是无序的词汇集合, 把每一单词都进行统计. 向量化 词袋模型首先会进行分词, 在分词之后. 通过通过统计在每个词在文本中出现的次数. 我们就可以得到该文本基于词语的特征, 如果将各个文本样本的这些词与对应的词频放在一起

  • Python机器学习NLP自然语言处理Word2vec电影影评建模

    目录 概述 词向量 词向量维度 代码实现 预处理 主程序 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 词向量 我们先来说说词向量究竟是什么. 当我们把文本交给算法来处理的时候, 计算机并不能理解我们输入的文本, 词向量就由此而生了. 简单的来说, 词向量就是将词语转换成数字组成的向量. 当我们描述一个人的时候, 我们会使用身高体重等种种指标, 这些指标就可以当做向量. 有了向量

随机推荐