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

server/2024/12/23 11:11:17/

数据准备

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.ppmy.cn/server/7107.html

相关文章

FastChat启动与部署通义千问大模型

FastChat简介 FastChat is an open platform for training, serving, and evaluating large language model based chatbots. FastChat powers Chatbot Arena, serving over 10 million chat requests for 70 LLMs.Chatbot Arena has collected over 500K human votes from sid…

每周一算法:负环判断

题目链接 负环 题目描述 给定一个 n n n 个点的有向图&#xff0c;请求出图中是否存在从顶点 1 1 1 出发能到达的负环。 负环的定义是&#xff1a;一条边权之和为负数的回路。 输入格式 本题单测试点有多组测试数据。 输入的第一行是一个整数 T T T&#xff0c;表示测…

【Kotlin】协程

1 前言 相较于 C# 中的协程&#xff08;详见 → 【Unity3D】协同程序&#xff09;&#xff0c;Kotlin 中协程更灵活&#xff0c;难度更大。 协程是一种并发设计模式&#xff0c;用于简化异步编程&#xff0c;它允许以顺序化的方式表达异步操作&#xff0c;避免回调地狱等问题。…

【JVM】JVM调优配置案例(高性能模板)

上一篇介绍了JVM调优可配置参数及配置时机和原则&#xff0c;为了帮助理解&#xff0c;这篇文章将提供一个JVM配置案例&#xff0c;适用于需要高性能和高稳定性的应用程序&#xff0c;如大型企业级应用、高流量的Web服务、大数据处理和分析任务等。当然&#xff0c;在实际部署之…

Python机器学习项目开发实战:怎么处理图像内容分析

注意&#xff1a;本文的下载教程&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程&#xff1a;Python机器学习项目开发实战_图像内容分析_编程案例解析实例详解课程教程.pdf Python在机器学习…

【设计模式】享元模式

目录 什么是享元模式 代码实现 什么是享元模式 Java中的享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它用于减少系统中对象的数量&#xff0c;以节省内存和提高性能。享元模式通过共享相似对象之间的公共部分来最小化内存使用。 在享…

Python相关性分析

分析连续变量之间线性相关程度的强弱&#xff0c;并用适当的统计指标表示出来的过程称为相关分析。 可以直接绘制散点图&#xff0c;或者绘制散点图矩阵&#xff0c;或者计算相关系数来进行相关分析。 相关系数的计算如下所示&#xff1a; 示例数据&#xff1a; 计算百合酱蒸…

JVM运行时内存溢出以及解决办法

JVM有哪些运行时数据区 JVM运行时数据区有程序计数器、本地方法栈虚拟机栈、堆、元数据区、直接内存。 其中只有程序计数器不是内存溢出&#xff0c;其他的都有可能会产生内存溢出。 栈内存溢出 当方法的调用深度过深&#xff0c;可能会导致栈内存溢出。 一般是发生在递归调…