1.1 文本训练化概述

  • 深度学习构建模型前需要将文本转化为向量表示(Word Embedding)。首先需要将文本转化为数字(文本序列化),在把数字转化为向量。
  • 可以考虑把文本中的每个词语和其对应的数字,使用字典保存,同时把句子转化为数字的列表。

1.2 文本序列化的过程

  • 实现文本序列化之前,应考虑一下几点:

    1. 如何使用字典把词语和数字进行对应;

    2. 不同的词语出现的次数不尽相同,是否需要对高频或者低频词语进行过滤

    3. 得到词典之后,如何把句子转化为数字序列,如何把数字序列转化为句子

    4. 不同句子长度不相同,每个batch的句子如何构造成相同的长度

    5. 对于新出现的词语在词典中没有出现怎么办(特殊字符代理)

2. 文本情感分类的模型构建

2.1 文本情感分类具体流程

  1. 数据预处理:读取文本数据,并按照批量的方式加载数据,使用DataLoader完成数据的读取,具体实现参考data_prepare.py
  2. 文本序列化:将文本数据转化向量表示(Word Embedding),具体实现参考save_ws.py
  3. 模型的构建和评估:由model.py实现

2. 2 代码

  • 步骤一:准备数据data_prepare.py
# coding:utf-8import torch
from torch.utils.data import DataLoader, Dataset
import os
import re
import pickledata_base_path = r"data\aclImdb"
ws = pickle.load(open("ws.pkl", "rb"))
max_len = 20# 1. 定义tokenize的方法
def tokenize(text):fileters = ['!', '"', '#', '$', '%', '&', '\(', '\)', '\*', '\+', ',', '-', '\.', '/', ':', ';', '<', '=', '>','\?', '@', '\[', '\\', '\]', '^', '_', '`', '\{', '\|', '\}', '~', '\t', '\n', '\x97', '\x96', '”', '“', ]text = re.sub("<.*?>", " ", text, flags=re.S)text = re.sub("|".join(fileters), " ", text, flags=re.S)return [i.strip() for i in text.split()]# 2. 准备dataset
class ImdbDataset(Dataset):def __init__(self, mode):# 调用父类初始化方法初始化继承的属性super(ImdbDataset, self).__init__()if mode == "train":text_path = [os.path.join(data_base_path, i) for i in ["train/neg", "train/pos"]]else:text_path = [os.path.join(data_base_path, i) for i in ["test/neg", "test/pos"]]self.total_file_path_list = []for i in text_path:self.total_file_path_list.extend([os.path.join(i, j) for j in os.listdir(i)])def __getitem__(self, idx):cur_path = self.total_file_path_list[idx]cur_filename = os.path.basename(cur_path)label = int(cur_filename.split("_")[-1].split(".")[0]) - 1  # 处理标题,获取label,转化为从[0-9]text = tokenize(open(cur_path, encoding="utf-8").read().strip())  # 直接按照空格进行分词return label, textdef __len__(self):return len(self.total_file_path_list)def collate_fn(batch):# batch是list,其中是一个一个元组,每个元组是dataset中__getitem__的结果label, content, = list(zip(*batch))content = [ws.transform(i, max_len=max_len) for i in content]content = torch.LongTensor(content)label = torch.LongTensor(label)return label, contentdef get_dataloader(train_data=True):mode = ""if train_data:mode = "train"imdb_dataset = ImdbDataset(mode)dataloader = DataLoader(dataset=imdb_dataset, batch_size=10, shuffle=True, collate_fn=collate_fn)return dataloaderif __name__ == '__main__':# 1. 定义tokenizetext = "I cannot stay indifferent<br></br> to Lars| van Trier's films. "s = tokenize(text)# 2. 实例化,准备dataloaderdataset = ImdbDataset(mode="train")dataloader = get_dataloader()# 3. 观察数据输出结果for idx, (label, text) in enumerate(dataloader):print("idx:", idx)print("table:", label)print("text:", text)break
  • 步骤二:文本序列化save_ws.py
# 2. 准备dataset
class ImdbDataset(Dataset):def __init__(self, mode):# 调用父类初始化方法初始化继承的属性super(ImdbDataset, self).__init__()if mode == "train":text_path = [os.path.join(data_base_path, i) for i in ["train/neg", "train/pos"]]else:text_path = [os.path.join(data_base_path, i) for i in ["test/neg", "test/pos"]]self.total_file_path_list = []for i in text_path:self.total_file_path_list.extend([os.path.join(i, j) for j in os.listdir(i)])def __getitem__(self, idx):cur_path = self.total_file_path_list[idx]cur_filename = os.path.basename(cur_path)label = int(cur_filename.split("_")[-1].split(".")[0]) - 1  # 处理标题,获取label,转化为从[0-9]text = tokenize(open(cur_path).read().strip())  # 直接按照空格进行分词return label, textdef __len__(self):return len(self.total_file_path_list)
  • 步骤三:模型评估和预测model.py
# coding:utf-8import pickle
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.optim import Adam
from unit21.data_prepare import get_dataloader, max_lenws = pickle.load(open("ws.pkl", "rb"))class IMDBModel(nn.Module):def __init__(self,max_len):super(IMDBModel,self).__init__()self.embedding = nn.Embedding(len(ws),300,padding_idx=ws.PAD) #[N,300]self.fc = nn.Linear(max_len*300,10)  #[max_len*300,10]def forward(self, x):embed = self.embedding(x) #[batch_size,max_len,300]embed = embed.view(x.size(0),-1)out = self.fc(embed)return F.log_softmax(out,dim=-1)model = IMDBModel(max_len)
optimizer = Adam(model.parameters(), 0.001)# 训练
def train(epoch):train_dataloader = get_dataloader()for idx, (target, input) in enumerate(train_dataloader):optimizer.zero_grad()output = model(input)loss = F.nll_loss(output, target)  # traget需要是[0,9],不能是[1-10]loss.backward()optimizer.step()if idx % 10 == 0:print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, idx * len(input), len(train_dataloader.dataset),100. * idx / len(train_dataloader), loss.item()))torch.save(model.state_dict(), "imdb_net.pkl")def test():test_loss = 0correct = 0train = Falsemodel.load_state_dict(torch.load("imdb_net.pkl"))model.eval()test_dataloader = get_dataloader()with torch.no_grad():for target, input in test_dataloader:output = model(input)test_loss += F.nll_loss(output, target, reduction="sum")pred = torch.max(output, dim=-1, keepdim=False)[-1]correct = pred.eq(target.data).sum()test_loss = test_loss / len(test_dataloader.dataset)print('\nTest set: Avg. loss: {:.4f}, Accuracy: {}/{} ({:.2f}%)\n'.format(test_loss, correct, len(test_dataloader.dataset),100. * correct / len(test_dataloader.dataset)))if __name__ == '__main__':epoch = 1train(epoch)#test()

二十一、文本情感分类二相关推荐

  1. python 多分类情感_文本情感分类(一):传统模型

    前言:四五月份的时候,我参加了两个数据挖掘相关的竞赛,分别是物电学院举办的"亮剑杯",以及第三届 "泰迪杯"全国大学生数据挖掘竞赛.很碰巧的是,两个比赛中,都有 ...

  2. python 多分类情感_python 文本情感分类

    对于一个简单的文本情感分类来说,其实就是一个二分类,这篇博客主要讲述的是使用scikit-learn来做文本情感分类.分类主要分为两步:1)训练,主要根据训练集来学习分类模型的规则.2)分类,先用已知 ...

  3. python 多分类情感词典_基于情感词典的文本情感分类

    基于情感词典的文本情感分类 传统的基于情感词典的文本情感分类,是对人的记忆和判断思维的最简单的模拟,如上图.我们首先通过学习来记忆一些基本词汇,如否定词语有"不",积极词语有&qu ...

  4. NLP之基于TextCNN的文本情感分类

    TextCNN 文章目录 TextCNN 1.理论 1.1 基础概念 **最大汇聚(池化)层:** ![请添加图片描述](https://img-blog.csdnimg.cn/10e6e1ed6bf ...

  5. 中文文本情感分类实战(weibo_senti_100k为数据集)

    中文文本情感分类 数据准备 加载数据集 搭建模型结构 训练脚本的搭建 测试脚本的编写 数据准备 使用jieba分词 data_processing.py import jiebadata_path = ...

  6. 李宏毅ML作业笔记4: RNN文本情感分类

    更新中... 目录 任务介绍 文本情感分类 句子喂入RNN的方式 半监督 data格式 代码思路 加载数据集 正确个数计算 word embedding 数据预处理 RNN模型构建 RNN模型训练 改 ...

  7. 基于pytorch的Bi-LSTM中文文本情感分类

    基于pytorch的Bi-LSTM中文文本情感分类 目录 基于pytorch的Bi-LSTM中文文本情感分类 一.前言 二.数据集的准备与处理 2.1 数据集介绍 2.2 文本向量化 2.3 数据集处 ...

  8. kaggle之电影文本情感分类

    电影文本情感分类 Github地址 Kaggle地址 这个任务主要是对电影评论文本进行情感分类,主要分为正面评论和负面评论,所以是一个二分类问题,二分类模型我们可以选取一些常见的模型比如贝叶斯.逻辑回 ...

  9. 疫情微博文本情感分类 (简化版SMP2020赛题)

    编者按 代码仅供参考,欢迎交流:请勿用于任何形式的课程作业.如有任何错误,敬请批评指正~ Pytorch系列文章: Pytorch实验一:从零实现Logistic回归和Softmax回归 Pytorc ...

最新文章

  1. python3之subprocess常见方法使用
  2. VRRP与VLAN实验(HuaWei)
  3. Unity 网络编程(Socket)应用
  4. java 泛型详解、Java中的泛型方法、 java泛型详解
  5. 详解Class类文件的结构(上)
  6. java ppt转html_word,ppt,excel转pdf,pdf转html工具类搭建
  7. javascript的性能优化
  8. mysql uroot p f_Mysql 5.7安装
  9. NeurIPS 2021 | 视频分类鲁棒性新基准
  10. (10)FPGA跨时钟域处理
  11. 东方电子全资子公司中标1.065亿元国家电网第三批采购项目
  12. 深度学习框架 TensorFlow.NET 0.1.0,完善变量更新操作
  13. NYOJ277 - 车牌号
  14. 波束形成matlab程序,mVDR波束形成matlab程序
  15. word 2007中在页眉中插入或这删除下划线
  16. Windows注册表内容详解(转载)
  17. 闪烁?卡顿?CSS硬件加速了解一下(will-change属性详解)
  18. J9数字论:区块链+DAO3:去中心化的互联网世界
  19. 简单有趣,半小时漫画中国史
  20. 成功编译和运行roslaunch qbo_webi qbo_webi.launch(解决qbo_object_recognition之后的其他问题)

热门文章

  1. 记一次MongoDB性能问题(从MySQL迁移到MongoDB)
  2. PHP-fpm 记录慢执行日志
  3. Redis和Memcached:数据类型 过期策略 持久策略 虚拟内存 Value大小
  4. jQuery Vue的CDN
  5. Git 企业中常用分支管理策略
  6. 使用apache模块rewrite_module
  7. proe输入数字时成双出现_天猫双11花呗可提额,支付宝输入几个数字,试试就知道...
  8. C语言表示一元四次函数,论c语言程序设计 第四次讨论.ppt
  9. 排队机叫号系统服务器安装设置,易达办事大厅排队叫号系统
  10. mysql防止误删除_mysql误删除处理方法