前言
前文已经介绍了TextCNN的基本原理,如果还不熟悉的建议看看原理:【深度学习】textCNN论文与原理[1]及一个简单的基于pytorch的图像分类案例:【深度学习】卷积神经网络-图片分类案例(pytorch实现)[2]。现在介绍一下如何使用textcnn进行文本分类,该部分内容参考了:Pytorch-textCNN(不调用torchtext与调用torchtext)[3]。当然原文写的也挺好的,不过感觉不够工程化。现在我们就来看看如何使用pytorch和cnn来进行文本分类吧。
1 实验语料介绍与预处理
本文进行的任务本质是一个情感二分类的任务,语料内容为英文,其格式如下:
一行文本即实际的一个样本,样本数据分别在neg.txt和pos.txt文件中。在进行数据预处理之前,先介绍一下本任务可能用到的一些参数,这些参数我放在了一个config.py的文件中,内容如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author: juzipi
@file: config.py
@time:2020/12/06
@description: 配置文件
"""
LARGE_SENTENCE_SIZE = 50 # 句子最大长度
BATCH_SIZE = 128 # 语料批次大小
LEARNING_RATE = 1e-3 # 学习率大小
EMBEDDING_SIZE = 200 # 词向量维度
KERNEL_LIST = [3, 4, 5] # 卷积核长度
FILTER_NUM = 100 # 每种卷积核输出通道数
DROPOUT = 0.5 # dropout概率
EPOCH = 20 # 训练轮次
下面就是数据预处理过程啦,先把代码堆上来:
import numpy as np
from collections import Counter
import random
import torch
from sklearn.model_selection import train_test_split
import config
random.seed(1000)
np.random.seed(1000)
torch.manual_seed(1000)
def read_data(filename):
"""
数据读取
:param filename: 文件路径
:return: 数据读取内容(整个文档的字符串)
"""
with open(filename, "r", encoding="utf8") as reader:
content = reader.read()
return content
def get_attrs():
"""
获取语料相关参数
:return: vob_size, pos_text, neg_text, total_text, index2word, word2index
"""
pos_text, neg_text = read_data("corpus/pos.txt"), read_data("corpus/neg.txt")
total_text = pos_text + '\n' + neg_text
text = total_text.split()
vocab = [w for w, f in Counter(text).most_common() if