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. 用pageOffice控件实现 office 文档在线编辑Word插入另外word文档的功能

    OA办公中,业务需要编辑word文档,需要插入另外word文档的功能. 怎么实现编辑word文档插入另外word文档呢? 2 实现方法 通过pageOffice实现简单的在线打开编辑word时, 通过 ...

  2. 在 JS 中使用 canvas 给图片添加文字水印

    实现说明: 1.先通过 new Image() 载入图片: 2.图片加载成功后使用 drawImage() 将图片绘制到画布上: 3.最后使用 fillText() 函数绘制水印. 下面展示了详细用法 ...

  3. pyqt5 子线程如何操作主线程GUI

    一.简介 在使用pyqt5编写gui时遇到两个问题,会导致界面崩溃,今天就围绕这两个问题来简单说明和改进. 1.在主线程中使用while无限循环会导致界面崩溃 2.在子线程中操作主线程gui会导致界面 ...

  4. 「Python实用秘技17」快速获取国内节假日安排

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第17 ...

  5. PHP 中使用 ElasticSearch 的最佳实践 (中)

    引言 在上一篇文章当中,我们介绍了如何在 ElasticSearch 中创建索引以及建立字段映射关系. 接下来的这篇文章,我们将在 Laravel 中对商品信息进行增删改查及搜索. 记得 Elasti ...

  6. Qt一键部署配置(Qt程序打包)

    Qt一键部署配置(Qt程序打包)   1.版本 系统版本:windows10 Qt版本:5.15.2 2.设置可执行程序输出路径 打开.pro文件,输入DESTDIR = $$PWD/../bin,这 ...

  7. RHCSA题目大纲

    1.配置IP地址2.配置软件仓库3.调试SELinux4.创建用户账户5. 配置cron计划任务6.创建共享目录7.配置NTP时间客户端  "chronyd服务"8. auto自动 ...

  8. ASP.NET MVC 出现: Uncaught ReferenceError: $ is not defined

    ASP.NET MVC 出现: Uncaught ReferenceError: $ is not defined 错误 将 _Layout.cshtml 中的三行代码,移动到 <head> ...

  9. 已将此(这些)订阅标记为不活动,必须将其重新初始化。需要删除 NoSync 订阅,然后重

    已将此(这些)订阅标记为不活动,必须将其重新初始化.需要删除 NoSync 订阅,然后重 查找状态不正常的发布 use distribution go select status,*from dbo. ...

  10. Grafana 开源了一款 eBPF 采集器 Beyla

    eBPF 的发展如火如荼,在可观测性领域大放异彩,Grafana 近期也发布了一款 eBPF 采集器,可以采集服务的 RED 指标,本文做一个尝鲜介绍,让读者有个大概了解. eBPF 基础介绍可以参考 ...