import torch
import torch.optim as optim
import torch.nn as nn
import numpy as np
import torch.nn.functional as F
from torchtext import data,datasets class Args:
max_vocab_size = 25000 #词表最大规模
n_labels = 5
epochs = 5
embedding_dim = 300
hidden_dim = 512
n_layers = 3
batch_size = 64
display_freq = 50
lr = 0.01 args = Args()
TEXT = data.Field()
LABEL = data.LabelField(dtype=torch.float)
train_data,valid_data,test_data = datasets.SST.splits(
TEXT,LABEL,fine_grained=True
)
TEXT.build_vocab(
train_data,
max_size = args.max_vocab_size,
vectors="glove.6B.300d",
unk_init = torch.Tensor.normal_
) LABEL.build_vocab(train_data)
device='cuda'
train_iter,valid_iter,test_iter=data.BucketIterator.splits(
(train_data,valid_data,test_data),
batch_size = args.batch_size,
device = device
)
input_dim = len(TEXT.vocab)
output_dim = args.n_labels class Model(nn.Module):
def __init__(self,
in_dim,
emb_dim,
hid_dim,
out_dim,
n_layer):
super(Model,self).__init__()
self.embedding = nn.Embedding(in_dim,emb_dim)
self.rnn = nn.LSTM(emb_dim,hid_dim,n_layer)
self.linear = nn.Linear(hid_dim,out_dim)
self.n_layer = n_layer
self.hid_dim = hid_dim
def forward(self,text):
embedded = self.embedding(text) #获取向量表示
h0 = embedded.new_zeros(
self.n_layer,embedded.size(1),self.hid_dim
)
c0 = embeded.new_zeros(
self.n_layer,embedded.size(1),self.hid_dim
)
output,(hn,cn) = self.rnn(embedded,(h0,c0))
return self.linear(output[-1]) model = Model(input_dim,args.embedding_dim,args.hidden_dim,output_dim,args.n_layers)
pretrained_embeddings = TEXT.vocab.vectors
model.embedding.weight.data.copy_(pretrained_embeddings)
model.to(device)
optimizer = optim.Adam(
model.parameters(),lr=args.lr
)
def train(epoch,model,iterator,optimizer):
loss_list = []
acc_list = []
model.train() for i,batch in tqdm(enumerate(iterator),total = len(iterator)):
optimizer.zero_grad()
text = batch.text.to(device)
label = batch.label.long().to(device)
predictions = model(text)
loss = F.cross_entropy(predictions,label)
loss.backward()
optimizer.step() acc = (predictions.max(1)[1] == label).float().mean()
loss_list.append(loss.item())
acc_list.append(acc.item()) if i % args.display_freq == 0:
print("Epoch %02d,Iter [%03d/%03d],"
"train loss = %.4f,train acc = %.4f" %
(epoch,i,len(iterator),np.mean(loss_list),np.mean(acc_list)))
loss_list.clear()
acc_list.clear() def evaluate(epoch,model,iterator):
val_loss = 0
val_acc = 0
model.eval()
with torch.no_grad():
for batch in iterator:
text = batch.text.to(device)
label = batch.label.long().to(device)
predictions = model(text)
loss = F.cross_entropy(predictions,label)
acc = (predictions.max(1)[1] == label).float().mean()
val_loss += loss.item()
val_acc += acc_item() val_loss = val_loss/len(iterator)
val_acc = val_acc/len(iterator)
print('...Epoch %02d,val loss = %.4f,val acc = %.4f' %(
epoch,val_loss,val_acc))
return val_loss,val_acc best_acc = 0
best_epoch = -1
for epoch in range(1,args.epochs+1):
train(epoch,model,train_iter,optimizer)
valid_loss,valid_acc = evaluate(epoch,model,valid_iter)
if valid_acc > best_acc:
best_acc = valid_acc
best_epoch = epoch
torch.save(
model.state_dict(),
'best-model.pth'
) print('Test best model @ Epoch %02d' % best_epoch)
model.load_state_dict(torch.load('best-model.pth'))
test_loss,test_acc = evaluate(epoch,model,test_iter)
print('Finally,test loss = %.4f,test acc = %.4f' %(test_loss,test_acc))

LSTM实现文本情感分类demo的更多相关文章

  1. NLP文本情感分类传统模型+深度学习(demo)

    文本情感分类: 文本情感分类(一):传统模型 摘自:http://spaces.ac.cn/index.php/archives/3360/ 测试句子:工信处女干事每月经过下属科室都要亲口交代24口交 ...

  2. pytorch 文本情感分类和命名实体识别NER中LSTM输出的区别

    文本情感分类: 文本情感分类采用LSTM的最后一层输出 比如双层的LSTM,使用正向的最后一层和反向的最后一层进行拼接 def forward(self,input): ''' :param inpu ...

  3. 文本情感分类:分词 OR 不分词(3)

    为什么要用深度学习模型?除了它更高精度等原因之外,还有一个重要原因,那就是它是目前唯一的能够实现“端到端”的模型.所谓“端到端”,就是能够直接将原始数据和标签输入,然后让模型自己完成一切过程——包括特 ...

  4. 基于Bert的文本情感分类

    详细代码已上传到github: click me Abstract:    Sentiment classification is the process of analyzing and reaso ...

  5. NLP之基于Bi-LSTM和注意力机制的文本情感分类

    Bi-LSTM(Attention) @ 目录 Bi-LSTM(Attention) 1.理论 1.1 文本分类和预测(翻译) 1.2 注意力模型 1.2.1 Attention模型 1.2.2 Bi ...

  6. kaggle之电影评论文本情感分类

    电影文本情感分类 Github地址 Kaggle地址 这个任务主要是对电影评论文本进行情感分类,主要分为正面评论和负面评论,所以是一个二分类问题,二分类模型我们可以选取一些常见的模型比如贝叶斯.逻辑回 ...

  7. NLP之基于TextCNN的文本情感分类

    TextCNN @ 目录 TextCNN 1.理论 1.1 基础概念 最大汇聚(池化)层: 1.2 textCNN模型结构 2.实验 2.1 实验步骤 2.2 算法模型 1.理论 1.1 基础概念 在 ...

  8. NLP入门(十)使用LSTM进行文本情感分析

    情感分析简介   文本情感分析(Sentiment Analysis)是自然语言处理(NLP)方法中常见的应用,也是一个有趣的基本任务,尤其是以提炼文本情绪内容为目的的分类.它是对带有情感色彩的主观性 ...

  9. NLP采用Bert进行简单文本情感分类

    参照当Bert遇上Kerashttps://spaces.ac.cn/archives/6736此示例准确率达到95.5%+ https://github.com/CyberZHG/keras-ber ...

  10. keras实例学习-双向LSTM进行imdb情感分类

    源码:https://github.com/keras-team/keras/blob/master/examples/imdb_bidirectional_lstm.py 及keras中文文档 1. ...

随机推荐

  1. 你知道 Java 有哪些引用吗?

    前言 判断对象是否要回收有引用计数法和可达性算法两种方式,无论哪种都离不开引用,本文将介绍Java的四种引用. 一.概述 二.详解 1. 强引用 概述 在Java程序中,强引用是最常见的也是默认的.n ...

  2. Github打不开解决办法(最新有效)

    Github打不开解决办法(最新有效) 1.  先看没解决之前的截图: 2.  解决方法(手动修改DNS): 2.1  以win11为例,第一步:打开 设置 - 网络和Internet,找到 高级网络 ...

  3. PyQGIS二次开发指南

    当你的数据处理使用的是Python语言,而你的导师又让你开发界面,那么PyQGIS二次开发指南是你必读的圣经.QGIS支持Python语言进行二次开发,你将学会如何使用Qt Designer进行界面设 ...

  4. 14个Flink SQL性能优化实践分享

    本文分享自华为云社区<Flink SQL性能优化实践> ,作者:超梦. 在大数据处理领域,Apache Flink以其流处理和批处理一体化的能力,成为许多企业的首选.然而,随着数据量的增长 ...

  5. 一文带你读懂Arthas实现原理

    一. 前言 Arthas 相信大家已经不陌生了,肯定用过太多次了,平时说到 Arthas 的时候都知道是基于Java Agent的,那么他具体是怎么实现呢,今天就一起来看看. 首先 Arthas 是在 ...

  6. 什么是Base64算法

    HTTP是超文本传输协议,所以HTTP协议中请求.相应都是以ASCII字符方式传输,如果要传输二进制需要经过BASE64或MIME等编码(因为HTTP协议pop3.smtp邮件协议都是针对文本的,而F ...

  7. 机器学习策略篇:详解可避免偏差(Avoidable bias)

    可避免偏差 如果希望学习算法能在训练集上表现良好,但有时实际上并不想做得太好.得知道人类水平的表现是怎样的,可以确切告诉算法在训练集上的表现到底应该有多好,或者有多不好,让我说明是什么意思吧. 经常使 ...

  8. nginx001

    本文档版权归属:陈雷雷,仅限学习交流 QQ:370460470 blog:www.chenleilei.net Nginx服务实践 简述Nginx(nginx.org) Nginx (engine x ...

  9. docker使用Open Policy Agent(OPA)进行访问控制

    目录 一.系统环境 二.前言 三.Open Policy Agent 简介 四.Rego 语言简介 五.配置基本环境 六.docker安装OPA插件 6.1 安装docker 6.2 docker安装 ...

  10. Docker入门系列之三:十二个Dockerfile指令

    本篇文章是关于Dockerfiles的,这是Docker系列文章的第三部分.如果您还没有读过第一部分,请先阅读它,您可以从全新的角度了解Docker容器概念. 第二部分是Docker生态系统的简要介绍 ...