【神经网络与深度学习】文本情感分类

数据准备

AclImdb – v1 Dataset 是用于二进制情绪分类的大型电影评论数据集,其涵盖比基准数据集更多的数据,其中有 25,000 条电影评论用于训练,25,000 条用于测试,还有其他未经标记的数据可供使用。

数据预处理和数据装载

import refrom torch.utils.data import DataLoader
from torch.utils.data import Dataset
import osdef tokenization(content):content = re.sub("<.*?>"," ",content)fileters = ['\t','\n','\x97','\x96','#','%','$','&',"\.","\?","!","\,"]content = re.sub("|".join(fileters)," ",content)tokens = [i.strip().lower() for i in content.split()]return tokensdef collate_fn(batch):""":param batch:( [tokens, labels], [tokens, labels]):return:"""content, label  = list(zip(*batch))return content,labelclass ImdbDataset(Dataset):def __init__(self, train=True):self.train_data_path = '..\\aclImdb\\train\\'self.test_data_path = '..\\aclImdb\\test\\'data_path = self.train_data_path if train else self.test_data_path#把所有文件名放入列表temp_data_path = [os.path.join(data_path,"pos"), os.path.join(data_path+"neg")]print(temp_data_path)self.total_file_path = [] #所有评论文件路径for path in temp_data_path:file_name_list = os.listdir(path)file_path_list = [os.path.join(path, i) for i in file_name_list if i.endswith(".txt")]self.total_file_path.extend(file_path_list)def __len__(self):return len(self.total_file_path)def __getitem__(self, index):file_path = self.total_file_path[index]# 获取labellabelstr = file_path.split("\\")[-2]label = 0 if labelstr == "neg" else 1# 获取内容content = open(file_path).read()tokens = tokenization(content)return tokens, labeldef get_data(train=True):imbd_dataset = ImdbDataset(train)data_loader = DataLoader(imbd_dataset, batch_size=2, shuffle=True,collate_fn=collate_fn)return data_loader

文本序列化

把文本里每个词语和其对应数字,使用字典保存 即句子—>数字列表
思路

  1. 句子进行分词(tokenization)
  2. 词语存入字典,统计出现次数,根据出现次数对齐进行过滤
  3. 把文本 转 数字序列
  4. 把 数字序列 转 文本

遇到新出现的字符再词典里没有,可以用特殊字符替代
预保持每个batch里的序列大小一致,使用填充方法

"""
构建词典 把句子转换成序列 再把序列转成句子
"""class Word2Sequence:UNK_TAG = "UNK"PAD_TAG = "PAD"UNK =0PAD =1def __init__(self):self.dict = {self.UNK_TAG: self.UNK,self.PAD_TAG: self.PAD}self.count = {}def fit(self, sentence):# 把单个句子保存到dictfor word in sentence:self.count[word] = self.count.get(word, 0)+1def build_vocab(self, min=5, max=None, max_features=None):""":param min::param max::param max_features: 一共保留多少个词语:return:"""# 删除count中词频小于min的词语self.count = {word:value for word, value in self.count.items() if value>min}# 删除count中词频大于max的词语if max is not None:self.count = {word: value for word, value in self.count.items() if value < max}# 限制保留的词语数if max_features is not None:temp = sorted(self.cout.items(), key=lambda x:x[-1], reverse=True)[:max_features]self.count = dict(temp)# 把 词语 ——>数字for word in self.count:self.dict[word] = len(self.dict)# 得到一个反转的dict字典self.inverse_dict = dict(zip(self.dict.values(), self.dict.keys()))def transform(self, sentence, max_len=None):"""把句子 转成 序列:param sentence:  [word1, word2, ..]:param max_len: 对句子进行填充或者裁剪:return:"""if max_len is not None:if max_len > len(sentence):sentence = sentence + [self.PAD_TAG] * (max_len - len(sentence)) # 填充if max_len < len(sentence):sentence = sentence[:max_len] # 裁剪return [self.dict.get(word, self.UNK) for word in sentence]def inverse_transform(self, indices):# 把 序列 ——>句子return [self.inverse_dict.get(idx) for idx in indices]if __name__ == '__main__':ws = Word2Sequence()ws.fit(["我","是","你","的","爸爸"])ws.fit(["我","是","我","的","人"])ws.build_vocab(min=0)print(ws.dict)re = ws.transform(["我","爱","人"],max_len=10)print(re)ret = ws.inverse_transform(re)print(ret)

模型构建(简单全连接)

注意 word_embedding的使用!

"""
定义模型
"""
import torch
import torch.nn as nn
import torch.nn.functional as F
from lib import ws,max_len
from dataset import get_data
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.embedding = nn.Embedding(len(ws), 100)self.fc = nn.Linear(100*max_len, 2)def forward(self, input):""":param input: [batch_size, max_len]:return:"""x = self.embedding(input) # [batch_size, max_len, 100]x = x.view([-1, 100*max_len])output = self.fc(x)return F.log_softmax(output,dim=-1)model = MyModel()
optimizer = torch.optim.Adam(model.parameters(),lr=0.001)
def train(epoch):for idx,(input,target) in enumerate(get_data(train=True)):# 梯度清零optimizer.zero_grad()output= model(input)loss = F.nll_loss(output,target)loss.backward()optimizer.step()print(loss.item())if __name__ == '__main__':for i in range(1):train(epoch=i)

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

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

相关文章

idm线程越多越好吗 idm线程数多少合适

IDM&#xff08;Internet Download Manager&#xff09;是一款流行的下载管理软件&#xff0c;它支持多线程下载&#xff0c;这意味着它可以同时建立多个连接来下载文件的不同部分&#xff0c;从而提高下载速度。我们在使用IDM的时候总是有很多疑问&#xff0c;今天我们学习IDM…

游戏开发者必看:Perforce Helix Core 的功能特点及游戏开发中的常用工具、典型用例介绍

「不出海&#xff0c;即出局」随着全球化的加速发展&#xff0c;企业出海已成燎原之势。日前&#xff0c;2024 亚马逊云科技出海全球化论坛在深圳成功举办。龙智携手 Perforce 亮相游戏行业展区&#xff0c;展示了Perforce Helix Core如何与主流游戏开发引擎高效集成&#xff0…

Pytest精通指南(12)Parametrize源码拆解

文章目录 前言Parametrize 参数化Parametrize 源码分析Parametrize 使用说明一个参数的参数化多个参数的参数化验证类中有多个测试函数验证变量或函数传递参数化验证笛卡尔积拓展用法 前言 在 pytest 中&#xff0c;有两种常见的参数化方法&#xff1a; pytest.mark.parametriz…

哈希密码破解方法汇总

案例: 如何破译 254aa248acb47dd654ca3ea53f48c2c26 e93a1ec56258df7674c4 258df7674c4 该hash加密串的原文信息 步骤: 1)通过Hash Analyzer - TunnelsUP站点了解该hash加密串所使用的哈希加密算法类型。 可知,使用了 sha2-256 加密算法。 2) 访问example_hashes [hash…

C语言-Linux:简单实现Linux的cp指令

在Linux操作系统中&#xff0c;cp 命令是一种常用的文件和目录复制工具。以下是对cp命令的详细说明&#xff0c;包括其基本语法、常用选项以及一些示例用法&#xff1a; 基本语法&#xff1a; cp [选项] 源 目标 其中&#xff1a; 源&#xff1a;指要复制的文件或目录。目标&am…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果 一、简单介绍 二、简单给视频添加水印图片效果实现…

【Linux学习】初识Linux指令(二)

文章标题 1.rm 指令2.man指令3.nano指令4.cp指令5.mv指令6.alias指令7. cat与8.echo指令 ⚶文章简介 ⚶本篇文章继上篇文章Linux指令讲解&#xff0c;本篇文章主要会涉及到的指令会有&#xff1a;rm指令与 *&#xff08;通配符&#xff09;的搭配使用&#xff0c;man指令&…

[重学Python]Day3 函数和模块的使用

[重学Python]Day3 函数和模块的使用 一、函数的作用二、定义函数三、函数的参数四、用模块管理函数五、练习&#xff08;一&#xff09;实现计算最大公约数和最小公倍数的函数&#xff08;二&#xff09;、实现判断一个数是不是回文数的函数&#xff08;三&#xff09;、实现判…

专业SEO优化指南:设置网站关键词的详细步骤

在网站SEO优化的过程中&#xff0c;关键词的设置是提升网站排名的关键步骤之一。那么&#xff0c;作为一名专业的SEO人员&#xff0c;如何有效地进行关键词设置呢&#xff1f;以下是一些详细的步骤&#xff1a; 1. 确定网站的核心关键词。 这需要深入理解网站的主题或产品。通…

整体性学习

整体性学习的顺序&#xff1a; 1.获取 2.理解&#xff08;明白&#xff09;3.拓展&#xff08;探究&#xff09;4.纠错&#xff08;调试&#xff09;5.应用 测试伴随每一个过程 例如&#xff1a; 吃饭&#xff08;去学习&#xff09;–>点菜&#xff08;学什么&#xff0c…

实时数据同步之Maxwell和Canal

文章目录 一、概述1、实时同步工具概述1.1 Maxwell 概述1.2 Canal概述 2、数据同步工作原理2.1 MySQL 主从复制过程2.2 两种工具工作原理 3、MySQL 的 binlog详解3.1 什么是 binlog3.2 binlog 的开启3.3 binlog 的分类设置 4、Maxwell和Canal对比5、环境安装 二、Maxwell 使用1…

日本极致产品力|一个战略符号打造年销售超4亿份的冰淇淋大单品

日本赤城乳业有一款冰棍——ガリガリ君(GariGarikun)&#xff0c;凭借着自己的“纯粹”打入市场&#xff0c;几十年来它成为许多日本人的夏日必备。他让人记忆最深刻的是战略符号——ガリガリ君&#xff0c;让赤城乳业打造出年销售4亿份的冰淇淋大单品。它是如何做到的呢? 石油…

Django——CBV源码解析

Django——CBV源码解析 以下是views模块调用as_view()方法的代码示例 # urls.py from django.contrib import admin from django.urls import path import app.viewsurlpatterns [path(admin/, admin.site.urls),path(app/, app.views.task.as_view()), ]# views.py class t…

Day55 动态规划 part15

Day55 动态规划 part15 392.判断子序列 我的思路&#xff1a; 自己还是只能想到双指针法 解答: class Solution {public boolean isSubsequence(String s, String t) {if(s.length() 0) {return true;}if(s.length() > t.length() || t.length() 0) {return false;}ch…

性能再升级!UNet+注意力机制,新SOTA分割准确率高达99%

UNet结合注意力机制能够有效提升图像分割任务的性能。 具体来说&#xff0c;通过将注意力模块集成到UNet的架构中&#xff0c;动态地重新分配网络的焦点&#xff0c;让其更集中在图像中对于分割任务关键的部分。这样UNet可以更有效地利用其跳跃连接特性&#xff0c;以精细的局…

VMware安装Linux虚拟机(rocky9)

软件准备&#xff1a; VMware虚拟机ISO系统镜像文件 选择创建虚拟机→典型→下一步→点击稍后安装操作系统 选择Linux系统和对应版本 输入虚拟机名称和选择保存位置 设置磁盘大小 根据需要自定义硬件配置→完成 然后点击编辑虚拟机设置→CD/DVD→选择ISO镜像 然后开启虚拟机→…

动态规划|343.整数拆分

力扣题目链接 class Solution { public:int integerBreak(int n) {vector<int> dp(n 1);dp[2] 1;for (int i 3; i < n ; i) {for (int j 1; j < i / 2; j) {dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j));}}return dp[n];} }; 思路 看到这道题目&…

【GD32】 2.39 FR1002人脸识别模块

2.39 FR1002人脸识别模块 FR1002人脸识别模组解决方案以高性能应用处理器为硬件平台&#xff0c;配合双目传感器进行活体检测&#xff0c;具有启动速度快、金融级的识别能力、超低使用功耗等特点。凭借超低功耗、强大的运算速度&#xff0c;在多种应用领域中&#xff0c;为各行…

关于《CS创世 SD NAND》的技术学习分享

最近发现一个好玩的东西《CS创世 SD NAND》&#xff0c;带大家一起体验一下。 本文引用了部分厂家产品资料及图像&#xff0c;如有侵权&#xff0c;请及时联系我删除&#xff0c;谢谢。 《CS创世 SD NAND》官方网站&#xff1a;http://www.longsto.com/ 什么是CS创世 SD NAND呢…

0基础刷图论最短路 1(从ATcoder 0分到1800分)

ATC最短路1 &#xff08;本文难度rated 0~ 1000&#xff09; 题目来源&#xff1a;Atcoder 题目收集&#xff1a; https://atcoder-tags.herokuapp.com/tags/Graph/Shortest-Path &#xff08;里面按tag分类好了Atcoder的所有题目&#xff0c;类似cf&#xff09; &#xff08;…