深度学习(文本分类)

news/2025/2/3 16:24:38/文章来源:https://www.cnblogs.com/tiandsp/p/18528616

上一篇熟悉了LSTM之后,就可以用这个工具做nlp相关的实验了。

下面两组代码是使用LSTM做文本分类的实验:

 一、更多使用自定义方法做文本分类的代码,有几个特点:

1. 数据集是根据csv文件格式解析的,用的自定义数据类。

2. 使用jieba分词。

3. 数据对齐使用了collate_fn和pad_sequence函数确保维度统一。

4. 使用之前word2vec训练好的result.model.bin模型将文本嵌入。

5. 由于单独使用的word2vec,因此模型中不再有Embedding模块。

import torch
import jieba
import numpy as np
import pandas as pd
import torch.nn as nn
from torch.nn.utils.rnn import pad_sequence
from torch.utils.data import Dataset, DataLoader
from gensim.models.keyedvectors import KeyedVectorsdevice = torch.device("cuda")word_vectors = KeyedVectors.load_word2vec_format('result.model.bin', binary = True)
word2idx = {word: idx + 1 for idx, word in enumerate(word_vectors.index_to_key)}batch_size = 8
embed_size = word_vectors.vector_size
hidden_size = 64
vocab_size = len(word2idx)
num_classes = 2
num_layers = 4print(vocab_size,embed_size)# 自定义数据集类
class TxTDataset(Dataset):def __init__(self, txt_file):self.df = pd.read_csv(txt_file)self.rows = self.df.shape[0]def __len__(self):return self.rowsdef __getitem__(self, index):txt = self.df.iloc[index, 0]scentence = []pos = jieba.cut(txt, cut_all = False)for term in pos:if term in word_vectors.index_to_key:scentence.append(word_vectors[term])if(self.df.iloc[index,1]=='正面'):label = np.array([1,0])else:label = np.array([0,1])  scentence = torch.from_numpy(np.array(scentence))label = torch.from_numpy(label).float()return scentence, labeldef collate_fn(x):data = []for i in range(len(x)):if len(x[i][0])==0:continuedata.append(x[i][0])data = pad_sequence(data, batch_first=True,padding_value=0).float()   scents = []labels = []for i in range(data.size(0)):scents.append(data[i,:,:])labels.append(x[i][1])return [scents,labels]class RnnClassifer(nn.Module):def __init__(self, embed_size, hidden_size, num_classes,num_layers):super(RnnClassifer, self).__init__()self.hidden_size = hidden_sizeself.num_layers = num_layersself.lstm = nn.LSTM(embed_size, hidden_size, num_layers, batch_first=True)self.norm = nn.LayerNorm(hidden_size)self.fc = nn.Linear(hidden_size, num_classes)self.sigmod = nn.Sigmoid()def forward(self, x):h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device) c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)x, _ = self.lstm(x, (h0, c0)) x = self.norm(x) x = self.fc(x[:, -1, :])return self.sigmod(x)model = RnnClassifer(embed_size,hidden_size,num_classes,num_layers)
model.to(device)
model.train()  train_dataset = TxTDataset('data_single.csv')
train_loader = DataLoader(train_dataset, batch_size, shuffle=True, collate_fn=collate_fn)cross = nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(model.parameters(),lr=1e-3)for epoch in range(10):correctSum = 0.0lossSum = 0.0dataLen = 0for inputs, labels in train_loader:inputs = torch.stack(inputs,dim=0).to(device)labels = torch.stack(labels,dim=0).to(device)outputs = model(inputs)loss = cross(outputs, labels)_, preds = torch.max(outputs,dim=1)  _, lab = torch.max(labels,dim=1)optimizer.zero_grad()loss.backward() optimizer.step()  correct = (preds == lab).sum() correctSum +=correctlossSum += loss.item()dataLen +=inputs.size(0)print('epoch loss prec:',epoch, lossSum/dataLen,(correctSum/dataLen).item())print(lossSum/dataLen, correctSum/dataLen)

二、更多使用现成函数做文本分类代码,更精简,和上组有几点不同:

1. 不使用自定义数据集,使用TabularDataset作为模版构造数据集。

2. 使用spacy分词。

3. 使用torchtext中Filed构造vocal词袋。

4. 使用BucketIterator做数据对齐。

5. 使用nn.Embedding做文本嵌入,比自己训练的word2vec更高效,所以模型中多了一个Embedding模块。

import spacy
import torch
import torch.utils
import torch.nn as nn
import torch.utils.data
from torchtext.data import Field, BucketIterator,TabularDatasetdevice = torch.device("cuda")
spacy_zh = spacy.load("zh_core_web_sm")class RnnClassifer(nn.Module):def __init__(self,vocab_size, embed_size, hidden_size, num_classes,num_layers):super(RnnClassifer, self).__init__()        self.embedding = nn.Embedding(vocab_size, embed_size) self.lstm = nn.LSTM(embed_size, hidden_size, num_layers, batch_first=True)self.norm = nn.LayerNorm(hidden_size)self.fc = nn.Linear(hidden_size, num_classes)self.sigmod = nn.Sigmoid()def forward(self, x, h):x = self.embedding(x)x, h = self.lstm(x, h)x = self.norm(x) x = self.fc(x[:, -1, :])return self.sigmod(x),hdef tokenizer(text): return [tok.text for tok in spacy_zh.tokenizer(text)]def detach(states):return [state.detach() for state in states] TEXT = Field(sequential=True, tokenize=tokenizer)
LABEL = Field(sequential=True,  tokenize=tokenizer)train_data = TabularDataset( path='data_single.csv',format='csv', fields={'evaluation':('evaluation', TEXT),'label':('label', LABEL) })TEXT.build_vocab(train_data)
LABEL.build_vocab(train_data)batch_size = 64
vocab_size = len(TEXT.vocab)
embed_size = 128
hidden_size = 64
num_classes = 2
num_layers = 3print(vocab_size)train_iterator = BucketIterator(train_data, batch_size=batch_size, device='cuda',   sort_key=lambda x: len(x.text),repeat=False,train=True, shuffle=True)model = RnnClassifer(vocab_size,embed_size,hidden_size,num_classes,num_layers)
model.to(device)
model.train()  cross = nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(model.parameters(),lr=1e-3)for epoch in range(50):correctSum = 0.0lossSum = 0.0dataLen = 0states = (torch.zeros(num_layers, batch_size, hidden_size).to(device),torch.zeros(num_layers, batch_size, hidden_size).to(device))for i, batch in enumerate(train_iterator): inputs = batch.evaluation.transpose(0,1).to(device)labels = (batch.label.transpose(0,1) - 2).to(device)labels = torch.cat((labels,1-labels),dim=1).float()if inputs.size(0)!=batch_size:continuestates = detach(states)outputs,states = model(inputs,states)loss = cross(outputs, labels)_, preds = torch.max(outputs,dim=1)  _, lab = torch.max(labels,dim=1)optimizer.zero_grad()loss.backward() optimizer.step()  correct = (preds == lab).sum() correctSum +=correctlossSum += loss.item()dataLen +=inputs.size(0)print('epoch loss prec:',epoch, lossSum/dataLen,(correctSum/dataLen).item())print(lossSum/dataLen, correctSum/dataLen)

训练数据下载地址:https://files.cnblogs.com/files/tiandsp/data_single.rar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/878296.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题解:P11637 Mod

题解:P11637 Mod 题目传送门 思路 一种比较简单的方法。 根据题意,我们可以发现在若干次操作后 \(a\) 能变成 \(0\) 的情况下,操作次数为 \(p-a\)。因为 \(b\) 的操作次数与 \(a\) 相同,所以 \(b\) 的值为 \(b-(p-a)\)。因为题面中要求 \(b\) 为一个自然数,所以自然就分成…

如何在markdown中写出横线除号

在 Markdown 中,您可以使用支持 LaTeX 数学公式的环境来表示“除数在上面,被除数在下面”的数学公式形式。以下是具体方法: 1. 使用分数形式 用 LaTeX 的 \frac 表达分数(除号的形式): 块级公式: $$\frac{a}{b}$$内联公式: $\frac{a}{b}$2. 使用纯文本的替代表示法 如果…

彻底搞懂分布式事务 XA 模式

原文地址: https://developer.aliyun.com/article/783796 简介: XA 协议是由 X/Open 组织提出的分布式事务处理规范,主要定义了事务管理器 TM 和局部资源管理器 RM 之间的接口。目前主流的数据库,比如 oracle、DB2 都是支持 XA 协议的。作者 | 朱晋君来源 | 阿里巴巴云原生…

.net6-jwt实现认证和自定义策略授权

场景 客户端根据用户名和密码访问登录接口获取token,服务端登录接口获取账号和密码进行验证,获取用户的角色,若角色是超级管理员则只能授权访问标记为超级管理员的接口,若角色是管理员则只能授权访问标记为管理员的接口。 实现JWT认证 安装JWT包 Microsoft.AspNetCore.Auth…

「ZJOI2017」树状数组 题解

前言 题目链接:洛谷;UOJ;LOJ。 UOJ 上有很强的数据。 题意简述 yzh 做 OI 题维护序列 \(\{a_n\}\)。 她实现了一个后缀和查询函数 \(\displaystyle f(x) = \begin{cases} 0 & \text{ if } x=0 \\ \sum\limits_{i=x}^n a_i & \text{ otherwise } \end{cases}\),和…

什么是SDK?

1. 什么是SDK?1.1. SDK的定义 1.2. SDK的组成 1.3. 举例说明1.3.1. 【示例一】 OpenCV 1.3.2. 【示例二】 JDK 1.3.3. 【示例三】微信SDK2. SDK与API2.1. 什么是API? 2.2. SDK与API的关系3. 什么是SDK开发?3.1. SDK开发包含哪些过程? 3.2. SDK开发的目标是什么? 3.3. SDK开…

小蚁摄像头通过rclone+alist实现监控视频自动上传至云盘

最近,我才发现我白嫖的一刻相册空间才到5g于是就想着把监控录制的视频全传到里面可是,这么搞好像有点麻烦,能不能让我的摄像头自己上传呢? 我的摄像头的型号是小蚁 1080p,刷入了yi-hack-v5 alist 开启ftp yi-hack-v5 ftp界面结果发现不行,放弃了 又看到这位老哥的samba方…

材料检测取样手册系统

为方便查询,特写了查询系统,支持桌面版和网页版,支持Excel导入数据库,支持数据库导出Excel,支持数据库备份,支持恢复数据库。数据库为MySQL

《操作系统真象还原》第十二章 进一步完善内核

本文是对《操作系统真象还原》第十二章学习的笔记,欢迎大家一起交流,目前所有代码已托管至 fdx-xdf/MyTinyOS 。第十二章 进一步完善内核 本文是对《操作系统真象还原》第十二章学习的笔记,欢迎大家一起交流,目前所有代码已托管至 fdx-xdf/MyTinyOS 。 实现系统调用 getpid…

深度学习(RNN,LSTM,GRU)

三个网络的架构图: RNN:LSTM:GRU:特性对比列表:特性RNNLSTMGRU门控数量无3门(输入/遗忘/输出)2门(更新/重置)记忆机制 仅隐藏状态ht显式状态Ct + 隐藏状态ht隐式记忆(通过门控更新状态)核心操作 直接状态传递门控细胞状态更新 门控候选状态混合 计算复杂度O(d2)(1组权…

AI定制祝福视频,广州塔、动态彩灯、LED表白,直播互动新玩法(附下载链接)

在追剧的时候经常能看到一些浪漫的告白桥段,男主用圣诞彩灯表白、用城市标志性建筑的LED表白,或者在五光十色的烟花绽放后刻下女主角的名字,充满了仪式感和氛围感~现在,这样的表白效果用AI软件就能实现了,在社交平台上甚至还出现了类似的直播内容,观众送热气球或者其他礼…