当前位置: 首页 > news >正文

N4 - Pytorch实现中文文本分类

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

目录

  • 任务描述
  • 步骤
    • 环境设置
    • 数据准备
    • 模型设计
    • 模型训练
    • 模型效果展示
  • 总结与心得体会


任务描述

在上周的任务中,我们使用torchtext下载了托管的英文的AG News数据集 进行了分类任务。本周我们来对中文的自定义数据集来进行分类任务。

自定义数据集的格式是csv格式,我们先用pandas进行读取,创建数据集对象。然后后面的步骤就和上周基本上一致了。

步骤

环境设置

import torch
import warningswarnings.filterwarnings('ignore') # 忽略警告# 创建全局设备对象
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
device

设备对象

数据准备

使用pandas读取数据

import pandas as pd
train_data = pd.read_csv('train.csv', sep='\t', header=None)
train_data.head()

查看前三条数据
可以看到数据有两列,第一列是文字内容,第二列是所属的标签。

接下来编写一个迭代器函数,每次迭代返回一对内容和标签

def custom_data_iter(texts, labels):for x, y in zip(texts, labels):yield x, y
train_iter = custom_data_iter(train_data[0].values[:], train_data[1].values[:])

然后创建词典,使用torchtext中的build_vocab_from_iterator工具函数

from torchtext.vocab import build_vocab_from_iterator
import jieba# 使用jieba库来做分词器
tokenizer = jieba.lcut # lcut直接返回列表, cut 返回一个迭代器# 编写一个迭代函数,每次返回一句内容的分词结果
def yield_tokens(data_iter):for text, _ in data_iter: # 每次返回一句内容和对应标签yield tokenizer(text) # 返回该句内容的分词列表# 创建词典
vocab = build_vocab_from_iterator(yield_tokens(train_iter), specials=['<unk>'])
vocab.set_default_index(vocab['<unk>'])# 测试词典
vocab(['我', '想', '看', '和平', '精英', '上', '战神', '必备', '技巧', '的', '游戏', '视频'])

词典结果
获取所有的标签名

label_name = list(set(train_data[1].values[:]))
print(label_name)

标签名列表
编写函数,将内容和标签分别转换成数值

text_pipeline = lambda x: vocab(tokenizer(x))
label_pipeline = lambda x: label_name.index(x)print(text_pipeline("我想看和平精英上战神必备技巧的游戏视频"))
print(label_pipeline('Video-Play'))

转换函数
编写文本的批处理函数,用于数据集与模型之间,将一个批次的文本数据转换为数值,还需要生成EmbeddingBag输入时的offsets参数。

from torch.utils.data import DataLoaderdef collate_batch(batch):label_list, text_list, offsets = [], [], [0]for (_text, _label) in batch:# 标签列表label_list.append(label_pipeline(_label))# 文本列表processed_text = torch.tensor(text_pipeline(_text), dtype=torch.int64)text_list.append(processed_text)# 偏移列表offsets.append(len(processed_text))label_list = torch.tensor(label_list, dtype=torch.int64)text_list = torch.cat(text_list)offsets = torch.tensor(offsets[:-1]).cumsum(dim=0)return text_list.to(device), label_list.to(device), offsets.to(device)dataloader = DataLoader(train_iter, batch_size=8, shuffle=False, collate_fn=collate_batch)

模型设计

和上节一样,一个EmbeddingBag层跟着一个全连接层就可以了

from torch import nnclass TextClassificationModel(nn.Module):# 参数随后设置def __init__(self, vocab_size, embed_dim, num_classes):super().__init__()self.embedding = nn.EmbeddingBag(vocab_size, embed_dim, sparse=False)self.fc = nn.Linear(embed_dim, num_classes)self.init_weights()# 自定义的权重初始化操作def init_weights(self):initrange = 0.5self.embedding.weight.data.uniform_(-initrange, initrange)self.fc.weight.data.uniform_(-initrange, initrange)self.fc.bias.data.zero_()# 向前传播def forward(self, text, offsets):embedded = self.embedding(text, offsets)return self.fc(embedded)

创建模型对象

num_classes = len(label_name) # 分类数量
vocab_size = len(vocab) # 词典大小
embedding_size = 64 # 嵌入向量的维度
model = TextClassificationModel(vocab_size, embedding_size, num_classes).to(device)
model

模型结构
可以看到,这个模型简单的很。

模型训练

首先编写训练和评估函数

def train(dataloader):model.train()total_acc, train_loss, total_count = 0, 0, 0log_interval = 50start_time = time.time()for idx, (text, label, offsets) in enumerate(dataloader):predicted_label = model(text, offsets)optimizer.zero_grad()loss = criterion(predicted_label, label)loss.backward()nn.utils.clip_grad_norm_(model.parameters(), 0.1) #梯度裁剪optimizer.step()total_acc += (predicted_label.argmax(1) == label).sum().item()train_loss += loss.item()total_count += label.size(0)if idx % log_interval == 0 and idx > 0:elapsed = time.time() - start_timeprint('| epoch {:1d} | {:4d}/{:4d} batches ''| train_acc {:4.3f} train_loss {:4.5f}'.format(epoch, idx, len(dataloader), total_acc/total_count, train_loss, total_count))total_acc, train_loss, total_count = 0, 0, 0start_time = time.time()def evaluate(dataloader):model.eval()total_acc, train_loss, total_count = 0, 0, 0with torch.no_grad():for idx, (text, label, offsets) in enumerate(dataloader):predicted_label = model(text, offsets)loss = criterion(predicted_label, label)total_acc += (predicted_label.argmax(1) == label).sum().item()train_loss += loss.item()total_count += label.size(0)return total_acc/total_count, train_loss/total_count

开始训练

from torch.utils.data import random_split
from torchtext.data.functional import to_map_style_dataset# 迭代次数
EPOCHS = 20
# 学习率
LR = 5
# 批次大小
BATCH_SIZE = 64criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=LR)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, 1.0, gamma=0.1)total_accu = None
train_iter = custom_data_iter(train_data[0].values[:], train_data[1].values[:])
train_dataset = to_map_style_dataset(train_iter)train_size = int(len(train_dataset)*0.8)
split_train_, split_valid_ = random_split(train_dataset, [train_size, len(train_dataset) - train_size])train_dataloader = DataLoader(split_train_, batch_size=BATCH_SIZE, shuffle=True, collate_fn=collate_batch)
valid_dataloader = DataLoader(split_valid_, batch_size=BATCH_SIZE, shuffle=True, collate_fn=collate_batch)for epoch in range(1, EPOCHS+1):epoch_start_time = time.time()train(train_dataloader)val_acc, val_loss = evaluate(valid_dataloader)lr = optimizer.state_dict()['param_groups'][0]['lr']if total_accu is not None and total_accu > val_acc:scheduler.step()else:total_accu = val_accprint('-'*69)print('| epoch {:1d} | time: {:4.2f}s | ''valid_acc {:4.3f} valid_loss {:4.3f} | lr {:4.6f}'.format(epoch, time.time() - epoch_start_time, val_acc, val_loss, lr))print('-'*69)

训练过程
训练结束后打印一下模型的准确度

model = model.to(device)
test_acc, test_loss = evaluate(valid_dataloader)
print('模型准确率为: {:5.4f}'.format(test_acc))

模型准确率

模型效果展示

自己写一句话让模型跑一下看看效果

def predict(text, text_pipeline):with torch.no_grad():text = torch.tensor(text_pipeline(text))output = model(text, torch.tensor([0]))return output.argmax(1).item()ex_text_str = '不要让一个男人听懂《水星记》'# 切换成CPU推理
model = model.to('cpu')
print('文本的分类是: %s' % label_name[predict(ex_text_str, text_pipeline)])

测试结果

总结与心得体会

通过测试,发现这个模型的效果还是不错的。大部分的句子可以给出正确的分类。和上节相比,中文数据集的文本分类任务和英文数据集的文本分类主要差异在tokenizer(分词器)上。英文的分词非常简单,英文的词之间天然有间隔,所以可以直接使用标点和空格来分割。中文就不太一样,中文需要一个好的断句工具才行,jieba库就是这么一个工具。在大部分的中文自然语言处理任务中,都可以看到它的身影。我在想是不是可以直接使用深度学习来进行分词,来达到更好的效果,或者直接使用大语言模型,经过Prompt直接变成分词工具来使用(只不过成本太高了),希望有时间可以尝试一下。

相关文章:

N4 - Pytorch实现中文文本分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 任务描述步骤环境设置数据准备模型设计模型训练模型效果展示 总结与心得体会 任务描述 在上周的任务中&#xff0c;我们使用torchtext下载了托管的英文的…...

centos 如何安装sox音视频处理工具

要在 CentOS 系统上安装 Sox 音频处理软件&#xff0c;你可以遵循以下步骤。请注意&#xff0c;这些说明适用于 CentOS 7&#xff0c;对于 CentOS 8 及更高版本&#xff0c;某些包管理命令可能略有不同。 第一步&#xff1a;安装所需的依赖库 首先&#xff0c;你需要安装一系列…...

Java语言程序设计——篇十一(2)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…...

Linux 应急响应靶场练习 1

靶场在知攻善防实验室公众号中可以获取 前景需要&#xff1a;小王急匆匆地找到小张&#xff0c;小王说"李哥&#xff0c;我dev服务器被黑了",快救救我&#xff01;&#xff01; 挑战内容&#xff1a; &#xff08;1&#xff09;黑客的IP地址 &#xff08;2&#xff0…...

AWS-Lambda的使用

介绍 Lambda 是一种无服务器(Serverless), 而且设计成事件驱动的计算服务器. 简单来说, 你可以将你的 code 上传, 当有事件产生(例如cronjob , 或者S3有新的文件被上传上來) , 你的code 就会在瞬间(零点几秒以內)被叫起來执行. 由于你不用管 Server如何维护, 或者自动扩展之类…...

python3.12 搭建MinerU 环境遇到的问题解决

报错&#xff1a; AttributeError: module pkgutil has no attribute ImpImporter. Did you mean: zipimporter? ERROR: Exception: Traceback (most recent call last):File "D:\ipa_workspace\MinerU\Lib\site-packages\pip\_internal\cli\base_command.py", …...

基于SpringBoot+Vue的流浪猫狗救助救援网站(带1w+文档)

基于SpringBootVue的流浪猫狗救助救援网站(带1w文档) 基于SpringBootVue的流浪猫狗救助救援网站(带1w文档) 该流浪猫狗救助救援网站在Windows平台下完成开发&#xff0c;采用java编程语言开发&#xff0c;将应用程序部署于Tomcat上&#xff0c;加之MySQL接口来实现交互式响应服…...

56_AOP

AOP使用案例 如何进行数据库和Redis中的数据同步&#xff1f;/ 你在项目的那些地方使用了aop&#xff1f;答&#xff1a;可以通过Aop操作来实现数据库和Redis中的数据同步。/ 通过Aop操作来实现数据库和Redis中的数据同步。可以定义一个切面类&#xff0c;通过对控制器下的所有…...

安装了h5py,使用报错ImportError: DLL load failed while importing _errors

使用pip 安装了h5py&#xff0c;但是运行代码报错&#xff1b; from . import _errorsImportError: DLL load failed while importing _errors: 找不到指定的程序。 原因&#xff1a; 可能和不正确安装h5py这个包有关系 解决&#xff1a; pip uninstall h5py 换成使用conda…...

BootStrap前端面试常见问题

在前端面试中&#xff0c;关于Bootstrap的问题通常围绕其基本概念、使用方式、特性以及实际应用等方面展开。以下是一些常见的问题及其详细解答&#xff1a; 1. Bootstrap是哪家公司研发的&#xff1f; 回答&#xff1a;Bootstrap是由Twitter的Mark Otto和Jacob Thornton合作…...

在linux运维中为什么第一道防线是云防火墙,而不是waf

在Linux运维和云计算环境中&#xff0c;第一道防线通常是云防火墙&#xff08;Cloud Firewall&#xff09;&#xff0c;而不是Web应用防火墙&#xff08;WAF&#xff09;&#xff0c;主要是因为云防火墙提供了更基础和广泛的网络层安全控制。以下是一些关键原因&#xff1a; 1…...

2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛

2022年中国高校计算机大赛-团队程序设计天梯赛&#xff08;GPLT&#xff09;上海理工大学校内选拔赛 2024.8.2 12:00————16:00 过题数790/1500 补题数943.33/1500 AB Problem Komorebi的数学课 次佛锅 Setsuna的K数列 Wiki下象棋 黄金律法 天气预报 叠硬币 AB Problem ag…...

多语言海外AEON抢单可连单加额外单源码,java版多语言抢单系统

多语言海外AEON抢单可连单加额外单源码&#xff0c;java版多语言抢单系统。此套是全新开发的java版多语言抢单系统。 后端java&#xff0c;用的若依框架&#xff0c;这套代码前后端是编译后的&#xff0c;测试可以正常使用&#xff0c;语言繁体&#xff0c;英文&#xff0c;日…...

文件上传——springboot大文件分片多线程上传功能,前端显示弹出上传进度框

一、项目搭建 创建 Spring Boot 项目: 创建一个新的 Spring Boot 项目&#xff0c;添加 Web 依赖。 添加依赖: 在 pom.xml 文件中添加以下依赖: <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId&…...

每日学术速递8.2

1.A Scalable Quantum Non-local Neural Network for Image Classification 标题&#xff1a; 用于图像分类的可扩展量子非局部神经网络 作者&#xff1a; Sparsh Gupta, Debanjan Konar, Vaneet Aggarwal 文章链接&#xff1a;https://arxiv.org/abs/2407.18906 摘要&#x…...

SAP-PLM创建物料主数据接口

FUNCTION zplm_d_0001_mm01. *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *" EXPORTING *" VALUE(EX_TOTAL) TYPE CHAR4 *" VALUE(EX_SUCCESSFUL) TYPE CHAR4 *" …...

超声波眼镜清洗机哪个品牌好?四款高性能超声波清洗机测评剖析

对于追求高生活质量的用户来说&#xff0c;眼镜的清洁绝对不能马虎。如果不定期清洁眼镜&#xff0c;时间久了&#xff0c;镜片的缝隙中会积累大量的灰尘和细菌&#xff0c;眼镜靠近眼部&#xff0c;对眼部健康有很大影响。在这种情况下&#xff0c;超声波清洗机显得尤为重要。…...

卸载Windows软件的正确姿势,你做对了吗?

前言 今天有小伙伴突然问我&#xff1a;她把软件都卸载了&#xff0c;但是怎么软件都还在运行&#xff1f; 这个问题估计很多小伙伴都是遇到过的&#xff0c;对于电脑小白来说&#xff0c;卸载Windows软件真的真的真的是一件很难的事情。所以&#xff0c;今天咱们就来讲讲&am…...

WEB前端14-Element UI(学生查询表案例/模糊查询/分页查询)

Vue2-Element UI 1.可重用组件的开发 可重用组件 我们一般将可重复使用的组件放在components目录之下&#xff0c;以便父组件的灵活调用 <!--可重用组件一般与css密切相关&#xff0c;使用可重用组件的目的是&#xff0c;将相似的组件放在一起&#xff0c;方便使用-->…...

使用swiftui自定义圆形进度条实现loading

实现的代码如下&#xff1a; // // LoadingView.swift // SwiftBook // // Created by Song on 2024/8/2. //import SwiftUIstruct LoadingView: View {State var process 0.5var body: some View {VStack(spacing: 20) {ZStack {Circle().stroke(.gray.opacity(0.3), lin…...

C# 设计模式之抽象工厂模式

总目录 前言 工厂方法模式是为了克服简单工厂模式的缺点而设计出来的&#xff0c;简单工厂模式的工厂类随着产品类的增加需要增加额外的代码&#xff0c;而工厂方法模式每个具体工厂类只完成单个实例的创建&#xff0c;所以它具有很好的可扩展性。但是在现实生活中&#xff0c…...

Javascript前端面试基础(八)

window.onload和$(document).ready区别 window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行$(document).ready()是DOM结构绘制完毕后就执行&#xff0c;不必等到加载完毕 window.onload 触发时机&#xff1a;window.onload 事件会在整个页面&#xf…...

R 语言学习教程,从入门到精通,R的安装与环境的配置(2)

1、R的安装与环境的配置 R语言是一款完全免费且开源的软件&#xff0c;它的开源许可证是GNU通用公共许可证&#xff08;GPL&#xff09;&#xff0c;这意味着任何人都可以自由地使用、复制、修改和发布R语言的源代码&#xff0c;甚至可以将其用于商业用途。 和python等其他语言…...

Python批量下载音乐功能

Python批量下载音乐功能 Python批量下载音乐,调用API接口,同时下载歌曲和歌词 先安排一下要用的模块&#xff0c;导入进来。 import re import json import requests目录结构 下载音乐 Awking_Class.pymusic.txt 文件文件写的是音乐名字,使用换行分割 new_music 注意这个 ne…...

用 Bytebase 实现批量、多环境、多租户数据库的丝滑变更

Bytebase 提供了多种功能来简化批量变更管理&#xff0c;适用于多环境或多租户情况。本教程将指导您如何使用 部署配置 和 数据库组 在不同场景下进行数据库批量变更。 默认流水线 vs 部署配置 图片数据库 vs 数据库组 1. 准备 请确保已安装 Docker&#xff0c;如果本地没有重…...

java之方法引用 —— ::

目录 一、简介 二、引用静态方法 1.格式 2.示例 ​编辑 3.条件解析 三、引用成员方法 1.格式 2.示例 四、引用构造方法 1.格式 2.示例 五、类名引用成员方法 1.格式 2.略微不同的方法引用规则 3.示例 六、引用数组的构造方法 1.格式 2.示例 一、简介 方…...

「测试线排查的一些经验-上篇」 后端工程师

文章目录 端口占用脚本失灵线上部署项目结构模版配置文件生效 一般产品研发过程所使用的环境可分为&#xff1a; 研发环境-dev测试环境-test生产环境-prod 软件开发中&#xff0c;完整测试环境包括&#xff1a;UT、IT、ST、UAT UT Unit Test 单元测试 IT System Integration …...

AOSP12_BatteryStats统计电池数据信息

前言 BatteryStats模块主要用于设备在电池供电是系统对各个模块电量使用的统计,Android提供的Battery Historain工具就是对此模块统计的数据进行解析和展示。 一 BatteryStats模块类图 模块主要类图如下:见根目录的模块类图 BatteryStats:抽象类,本模块的核心类,主要定…...

【Android Studio】UI 布局

文章目录 view布局LinearLayout view 在Android开发中&#xff0c;View是一个非常重要的概念&#xff0c;它是所有用户界面组件的基类。View类及其子类构成了Android应用中的用户界面。每个View都占用屏幕上的一个矩形区域&#xff0c;并可以响应用户输入&#xff08;如触摸、按…...

虚拟机Windows server忘记密码解决方法

原理 utilman.exe是Windows辅助工具管理器程序&#xff0c;‌虽然它本身不是一个关键的系统进程&#xff0c;‌但通过修改这个文件&#xff0c;‌用户可以访问一些有用的UI设置。‌在某些情况下&#xff0c;‌比如忘记密码需要重置时&#xff0c;‌通过修改utilman.exe文件为c…...

cms建站系统哪家好/2024年新冠疫情最新消息今天

我们在调试WebPart或者EventHandler之类的自定义组件时会遇到如何定位部署的网站集所对应的w3wp.exe进程的问题&#xff0c;方法如下 :方法1.直接开始运行&#xff0c;输入cmd&#xff0c;再输入iisapp可以列出当前所有IIS中的WebApplication所对应的w3wp.exe进程&#xff0c;后…...

企业建设网站的好处/国内10大搜索引擎

盼望着&#xff0c;盼望着。在其他省市的小伙伴早已开奖&#xff0c;奖金都快花完了的时候。北京的同学们&#xff0c;终于可以开奖退税了。点开之前&#xff0c;谁也不知道是喜是忧&#xff1b;点开之后&#xff0c;有人欢喜有人愁。拿出早已收藏好的办税攻略&#xff0c;把看…...

nas有域名了怎么做网站/seo诊断分析工具

Windows部署服务是SystemCenter2012SP1的体系中属于一个必要环节&#xff0c;对VMM和SCCM来说&#xff0c;Windows部署服务&#xff08;WDS&#xff09;显得尤为重要&#xff0c;在批量化的运维当中&#xff0c;WDS能够节约基层运维人员大量的工作时间&#xff0c;降低重复劳动…...

洛阳疾控最新通告今天/seo官网优化怎么做

1、标识符由字母、数字、下划线组成&#xff1b;2、标识符不能以数字开头&#xff1b;3、标识符区分大小写&#xff1b;PS:以下划线开头的标识符具有特殊意义&#xff1a; 以单下划线开头 &#xff08;如_init&#xff09; 为不能直接访问的类属性&#xff0c;必须通过类提供的…...

网站左边logo图标怎么做/苏州网站维护

一、jQuery概述 宗旨: Write Less, Do More. 基础知识&#xff1a; 1.符号$代替document.getElementById()函数 2.使用CssXpath来查询页面元素 3.适当的混用jQuery、Dom和JavaScript能够提升程序的执行效率。 如&#xff1a;Offset、App…...

用什么系统做威客网站/网络推广员具体做什么的

ps&#xff1a;对go 不太熟悉&#xff0c;只因利用docker镜像golang 编译时报错&#xff0c;所以记录下 dockerfile FROM golang WORKDIR /go/src/app ADD . /go/src/app RUN go get -u -v github.com/kardianos/govendor ##安装govendor&#xff0c;govendor用来管理项目的…...