基于word2vec+TextCNN 作文本分类

一. 准备工作:

  1. 环境:python3.7+torch+GPU

  2. 数据集:网上下载的4分类中文文本,如下图:

  3. 模块使用:

import os
import jieba
import torch
import joblib
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
import torch.optim as optim
  1. 模型参数配置
# 模型配置参数
class Config:label_map_dict = {'体育': 0, '女性': 1, '文学': 2, '校园': 3}  # 类别映射字典stopword = [i.strip() for i in open('./datasets/stop/stopword.txt', encoding='utf-8')]  # 停用词sentence_lenth = 50  # 句子截断长度batch_size = 10  # 批次数output_channel = 3  # 输出通道embedding_size = 5  # 嵌入词向量长度vocab_dict_ = joblib.load('./models/vocab_dict')
  1. 中文分词后编辑词汇表
# 生成词汇表
def vocab_dict(*args, base_path='./datasets/train'):vocab = set()for i in args:dataset = Dataset_(base_path, i)for s in range(len(dataset)):for v in dataset[s][0]:vocab.add(v)vocab_dict = {word: idx+1 for idx, word in enumerate(vocab)}vocab_dict['unkown'] = 0return vocab_dict
# 保存响应词汇表,供神经网络中Embedding使用
joblib.dump(vocab_dict('体育', '女性', '文学', '校园'), './models/vocab_dict')

二. 数据加载器

  1. 数据集类编写

    class Dataset_(Dataset):def __init__(self, base_path, label_path):self.base_path = base_pathself.label = label_pathself.items_path = os.path.join(base_path, self.label)self.items = os.listdir(self.items_path)def __getitem__(self, index):label = Config.label_map_dict.get(self.label)sentence = list(self.cut_word(open(os.path.join(self.items_path, self.items[index])).read()))sentence_ = []for i in sentence:if Config.vocab_dict_.get(i, None):sentence_.append(Config.vocab_dict_[i])else:sentence_.append(Config.vocab_dict_['unkown'])if len(sentence_) > Config.sentence_lenth:sentence_ = sentence_[:Config.sentence_lenth]elif len(sentence_) < Config.sentence_lenth:sentence_.extend([0 for i in range(Config.sentence_lenth-len(sentence_))])return sentence_, labeldef __len__(self):return len(self.items)@staticmethoddef cut_word(text):return [i.strip() for i in jieba.cut(text) if i.strip() not in Config.stopword and i.strip() is not None]
    
  2. 数据加载器格式化输出

    # 自定义Dataloder加载器数据输出格式
    def truncate(data_list):""" 传进一个batch_size大小的数据"""x_train = []label = []for data in data_list:x_train.append((data[0]))label.append(data[1])return torch.tensor(x_train), torch.tensor(label)loader_t = DataLoader(Dataset_('./datasets/train', '体育'), batch_size=10, collate_fn=truncate)
    loader_n = DataLoader(Dataset_('./datasets/train', '女性'), batch_size=10, collate_fn=truncate)
    loader_w = DataLoader(Dataset_('./datasets/train', '文学'), batch_size=10, collate_fn=truncate)
    loader_x = DataLoader(Dataset_('./datasets/train', '校园'), batch_size=10, collate_fn=truncate)
    

    三. 模型搭建

    1. TextCNN类

      # 模型搭建
      class TextCNN(nn.Module):def __init__(self):super(TextCNN, self).__init__()self.embeding = nn.Embedding(num_embeddings=len(Config.vocab_dict_), embedding_dim=Config.embedding_size)self.cord = nn.Sequential(nn.Conv2d(in_channels=1, out_channels=Config.output_channel, kernel_size=(2, Config.embedding_size)),nn.ReLU(),# nn.MaxPool1d(3, stride=2), 2维卷积需要使用2维池化nn.MaxPool2d((2, 1), stride=2))self.fc = nn.Linear(Config.output_channel * 24, len(Config.label_map_dict))self.sf = nn.Softmax(dim=1)def forward(self, X):batch_size = X.shape[0]embedding_x = self.embeding(X)embedding_x = embedding_x.unsqueeze(1)  # 卷积神经网络输入4维,conved = self.cord(embedding_x)flatten = conved.view(batch_size, -1)  # 展平成一维output = self.sf(self.fc(flatten))return output
      

      四. 训练模型

      for epoch in range(5000):for i in ['t', 'n', 'w', 'x']:for X_train, y_train in eval(f'loader_{i}'):pred = textCNN(X_train.to(device))loss = criterion(pred, y_train.to(device))optimizer.zero_grad()loss.backward()optimizer.step()print(f'轮训第{epoch+1}遍,损失{loss.data:.6f}')
      

      ##五. 模型保存

       # 保留模型参数# 保存torch.save(model.state_dict(), '\parameter.pkl')# 加载model = TheModelClass(...)# model.load_state_dict(torch.load('\parameter.pkl'))# 保存完整模型# 保存torch.save(TextCNN, './models/model.pkl')# 加载model = torch.load('./models/model.pkl')
      

      训练如下图:

基于word2vec+TextCNN 实现中文文本分类相关推荐

  1. Pytorch TextCNN实现中文文本分类(附完整训练代码)

    Pytorch TextCNN实现中文文本分类(附完整训练代码) 目录 Pytorch TextCNN实现中文文本分类(附完整训练代码) 一.项目介绍 二.中文文本数据集 (1)THUCNews文本数 ...

  2. 万字总结Keras深度学习中文文本分类

    摘要:文章将详细讲解Keras实现经典的深度学习文本分类算法,包括LSTM.BiLSTM.BiLSTM+Attention和CNN.TextCNN. 本文分享自华为云社区<Keras深度学习中文 ...

  3. 电商评论文本情感分类(中文文本分类)(第二部分-Bert)

    电商评论文本情感分类(中文文本分类) 第二部分-Bert部分 第一部分:textcnn部分 本项目包含: 1.中文文本处理 2.中文词云图绘制(在第一部分) 3.中文词嵌入 4.基于textcnn的中 ...

  4. Tensorflow使用CNN卷积神经网络以及RNN(Lstm、Gru)循环神经网络进行中文文本分类

    Tensorflow使用CNN卷积神经网络以及RNN(Lstm.Gru)循环神经网络进行中文文本分类 本案例采用清华大学NLP组提供的THUCNews新闻文本分类数据集的一个子集进行训练和测试http ...

  5. textcnn文本词向量_基于Text-CNN模型的中文文本分类实战

    1 文本分类 文本分类是自然语言处理领域最活跃的研究方向之一,目前文本分类在工业界的应用场景非常普遍,从新闻的分类.商品评论信息的情感分类到微博信息打标签辅助推荐系统,了解文本分类技术是NLP初学者比 ...

  6. 基于Text-CNN模型的中文文本分类实战

    七月 上海 | 高性能计算之GPU CUDA培训 7月27-29日三天密集式学习  快速带你入门阅读全文> 正文共5260个字,21张图,预计阅读时间28分钟. Text-CNN 1.文本分类 ...

  7. 基于CNN中文文本分类实战

    一.前言 之前写过一篇基于循环神经网络(RNN)的情感分类文章,这次我们换种思路,采用卷积神经网络(CNN)来进行文本分类任务.倘若对CNN如何在文本上进行卷积的可以移步博主的快速入门CNN在NLP中 ...

  8. python中文文本分析_基于CNN的中文文本分类算法(可应用于垃圾邮件过滤、情感分析等场景)...

    基于cnn的中文文本分类算法 简介 参考IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW实现的一个简单的卷积神经网络,用于中文文本分类任 ...

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

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

最新文章

  1. 关于向Mybatis传递多个参数进行SQL查询的用法
  2. html里调用css的语句
  3. emberjs重写补充类之reopen方法和reopenClass方法
  4. 动态给实例添加属性和方法
  5. PIP 安装 numpy
  6. 95-080-040-源码-启动-start-cluster.sh
  7. 【GCN】2021年,我终于决定入门GCN
  8. CentOS 6.9之LVM创建,扩容
  9. 2012年度总结:内心宁静的2012
  10. 开关电源—Buck电路原理及其仿真
  11. YoloV3 先验框
  12. 好书、买书、看书---乐在其中
  13. 搭档之家| 工作生活中的5个顶级思维(一)
  14. KGB知识图谱成功落地金融行业
  15. 基于51单片机的LED彩灯控制器设计
  16. “蔚来杯“2022牛客暑期多校训练营1 J Serval and Essay(图的启发式合并)
  17. UTF-8和utf8的区别
  18. Ambarella : 一家伟大的视频压缩处理芯片厂商
  19. 允许使用计算机的软件,解决win10“你的电脑设置仅允许安装来自应用商店的应用”的方法...
  20. 这里告诉大家,“后端开发工程师”到底是做什么的。

热门文章

  1. 性能测试第七课--用户定义变量用户参数
  2. Unity 滚球游戏
  3. 2021-02-04
  4. 电商网络推广是干什么,电商网络营销做什么
  5. 2022年金砖国家职业技能大赛(决赛)网络空间安全赛项 | 浙江赛区选拔赛 任务书
  6. 小学计算机课教案表格,小学信息技术教学设计《插入表格》
  7. 基于FPGA的EMAC模块和FIFO模块
  8. JavaScript---BOM基础
  9. Java正则匹配字母,数字,特殊字符
  10. 【最终省二】全国大学生数学建模大赛-参赛经历