LSTM实现文本情感分类demo
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的更多相关文章
- NLP文本情感分类传统模型+深度学习(demo)
文本情感分类: 文本情感分类(一):传统模型 摘自:http://spaces.ac.cn/index.php/archives/3360/ 测试句子:工信处女干事每月经过下属科室都要亲口交代24口交 ...
- pytorch 文本情感分类和命名实体识别NER中LSTM输出的区别
文本情感分类: 文本情感分类采用LSTM的最后一层输出 比如双层的LSTM,使用正向的最后一层和反向的最后一层进行拼接 def forward(self,input): ''' :param inpu ...
- 文本情感分类:分词 OR 不分词(3)
为什么要用深度学习模型?除了它更高精度等原因之外,还有一个重要原因,那就是它是目前唯一的能够实现“端到端”的模型.所谓“端到端”,就是能够直接将原始数据和标签输入,然后让模型自己完成一切过程——包括特 ...
- 基于Bert的文本情感分类
详细代码已上传到github: click me Abstract: Sentiment classification is the process of analyzing and reaso ...
- NLP之基于Bi-LSTM和注意力机制的文本情感分类
Bi-LSTM(Attention) @ 目录 Bi-LSTM(Attention) 1.理论 1.1 文本分类和预测(翻译) 1.2 注意力模型 1.2.1 Attention模型 1.2.2 Bi ...
- kaggle之电影评论文本情感分类
电影文本情感分类 Github地址 Kaggle地址 这个任务主要是对电影评论文本进行情感分类,主要分为正面评论和负面评论,所以是一个二分类问题,二分类模型我们可以选取一些常见的模型比如贝叶斯.逻辑回 ...
- NLP之基于TextCNN的文本情感分类
TextCNN @ 目录 TextCNN 1.理论 1.1 基础概念 最大汇聚(池化)层: 1.2 textCNN模型结构 2.实验 2.1 实验步骤 2.2 算法模型 1.理论 1.1 基础概念 在 ...
- NLP入门(十)使用LSTM进行文本情感分析
情感分析简介 文本情感分析(Sentiment Analysis)是自然语言处理(NLP)方法中常见的应用,也是一个有趣的基本任务,尤其是以提炼文本情绪内容为目的的分类.它是对带有情感色彩的主观性 ...
- NLP采用Bert进行简单文本情感分类
参照当Bert遇上Kerashttps://spaces.ac.cn/archives/6736此示例准确率达到95.5%+ https://github.com/CyberZHG/keras-ber ...
- keras实例学习-双向LSTM进行imdb情感分类
源码:https://github.com/keras-team/keras/blob/master/examples/imdb_bidirectional_lstm.py 及keras中文文档 1. ...
随机推荐
- Pageoffice6 实现后台批量转PDF文档
在实际项目开发中如果遇到批量动态生成PDF文档的需求,只需参考后台批量生成PDF文档,目前网上也有一些针对此需求的方案,如果您想要了解这些方案的对比,请查看后台生成单个Word文档中的"方案 ...
- vue项目使用研究1
在windows上安装了npm vue-cli之后,创建vue项目. 用pycharm打开 vue form表单最简单提交方法 <!DOCTYPE html> <html lang= ...
- CSS旋转正方体
CSS实现一个旋转的正方体,鼠标放上去会自动解体.比较普通的实现,留个记录.(代码里的注释方式写错了) <!doctype html> <html lang="en&quo ...
- C#.Net筑基-类型系统②常见类型
01.结构体类型Struct 结构体 struct 是一种用户自定义的值类型,常用于定义一些简单(轻量)的数据结构.对于一些局部使用的数据结构,优先使用结构体,效率要高很多. 可以有构造函数,也可以没 ...
- centos7中输入ifconfig 没有IP地址
vmware安装的centos7中没有出现eth0网卡,也没有ip,不能上网,输入ifconfig后如下图 解决办法 1.编辑网卡的配置文件 vi /etc/sysconfig/network-scr ...
- RocketMQ主从同步原理
一. 主从同步概述 主从同步这个概念相信大家在平时的工作中,多少都会听到.其目的主要是用于做一备份类操作,以及一些读写分离场景.比如我们常用的关系型数据库mysql,就有主从同步功能在. 主从同步,就 ...
- MyBatis两级缓存机制详解
缓存是提高软硬件系统性能的一种重要手段:硬件层面,现代先进CPU有三级缓存,而MyBatis也提供了缓存机制,通过缓存机制可以大大提高我们查询性能. 一级缓存 Mybatis对缓存提供支持,但是在 ...
- CSS——position定位属性
就像photoshop中的图层功能会把一整张图片分层一个个图层一样,网页布局中的每一个元素也可以看成是一个个类似图层的层模型.层布局模型就是把网页中的每一个元素看成是一层一层的,然后通过定位属性pos ...
- Android 12(S) Binder(二)
前面一节学习了ServiceManager这个特殊service的工作过程,这一节来看看普通service的工作过程. 就用media.extractor这个service来当例子! 1.服务的注册及 ...
- 使用 Java 客户端通过 HTTPS 连接到 Easysearch
Easysearch 一直致力于提高易用性,这也是我们的核心宗旨,然而之前一直没有官方的 Java 客户端,也对用户使用造成了一些困扰,现在,我们正式发布了第一个 Java 客户端 Easysearc ...