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. 2023年的Clion内建立多个子项目(保姆级教程)

    目录 下载插件C/C++ Single File Execution 项目操作 其他操作 下载插件C/C++ Single File Execution 项目操作 1.新建项目-->如图所示操作 ...

  2. pageoffice6 实现提取数据区域为子文件(Word拆分)

    在实际的开发过程中,有时会遇到希望提取Word文档中部分内容保存为子文件的需求,PageOffice支持提取Word文档数据区域中的内容为一个Word文件流,在服务器端创建PageOffice的Wor ...

  3. ollama 源代码中值得阅读的部分

    阅读 Ollama 源代码以了解其内部工作机制.扩展功能或参与贡献,以下是一些值得重点关注的部分: 1. 核心服务模块: 查找负责启动和管理模型服务的主程序或类,这通常是整个项目的核心逻辑所在.关注如 ...

  4. WPF登录界面样例

    XAML文件内容如下 1 <Window x:Class="ERP.Views.Login" 2 xmlns="http://schemas.microsoft.c ...

  5. 设置MySQL数据库的远程连接权限

    解决方案 在服务器上登录数据库,然后执行如下授权SQL语句.该授权SQL语句的含义为root用户可用任何IP地址登录数据库,操作任何数据库中的任何对象.   GRANT ALL PRIVILEGES ...

  6. 【C#】 封装的异步HttpRequest

      private async void btn_userLogin_Click(object sender, EventArgs e)        {            UInfo = new ...

  7. Chart.js (v2.9.4) 2-主要的函数和对象介绍

    Color() :主要负责渲染图表时候,针对颜色处理相关函数 helpers_core:工具对象,提供了基础的工具函数功能,遍历数组,扩展对象,合并对象,克隆对象等等. core_defaults:负 ...

  8. .net core 转 excel datatable list<t> 互转 xlsx

    using System; using System.Collections; using System.Collections.Generic; using System.ComponentMode ...

  9. 一文搞懂C++继承、多继承、菱形继承、虚继承

    继承 目录 继承 继承 继承的访问权限 子类赋值给父类 赋值兼容规则 "天然"的行为 验证: 1. 其他权限继承能否支持赋值兼容规则 2.是否"天然",有没有产 ...

  10. zabbix笔记_005 zabbix自动发现

    自动发现 [消耗资源较大] 1.1 自动发现监控主机 自动发现的好处: 快速发现,并自动添加主机,省去管理员配置的麻烦. 管理简单高效 zabbix监控构建速度更高效 1.2 自动发现的原理 自动发现 ...