基于textCNN的文本分类模型(复现+优化)

基于textCNN的文本分类模型(论文复现+优化)

一、模型架构

此文章主要总结个人复现textCNN模型的一些知识并且做了一些优化。整个的模型架构如下所示
在这里插入图片描述
整个架构大体上包括三个部分:

  • 输入层,将数据集语句通过Embedding的方式构建成一个二维的矩阵;
  • CNN + activate + max_pooling块,核心部分,输入的数据通过三个这样的块,得到三组特征,一组特征包含2个(论文中为2,实际上此值等于卷积层中隐藏层的个数)
  • 第三部分是一个线性分类器,根据类别数量的不同设置不同的输出

二、代码复现

代码复现也包括三部分:

  • 数据处理,包括如何读取数据集、建立词表以及构建数据集类
  • 模型架构构建
  • 模型训练与调参

下面展开介绍,数据集需要的话可以私信联系。
数据处理

def read_data(file_name, data_num=None):
    texts = []
    labels = []
    with open(os.path.join("..", "data", file_name + ".txt"),"r", encoding="utf-8") as f:
        all_data = f.read().split("\n")
        for data in all_data:
            if data == "":
                continue
            text, label = data.split("\t")
            texts.append(text)
            labels.append(label)
    if data_num is None:
        return texts, labels
    return texts[:data_num], labels[:data_num]

这段代码实现了将文本数据读入两个列表中:textslabels,用于构建词典。

def build_corpus(texts, embed_size):
    word2idx = {"PAD":0, "UNK":1}
    for text in texts:
        for word in text:
            if word2idx.get(word) is None:
                word2idx[word] = len(word2idx)
    return word2idx, nn.Embedding(len(word2idx), embed_size)

这段代码通过传入文本构建出词表,并且预先给定了两个词<PAD>和<UNK>用于表示特殊的填充和不明字,随后通过字典的get方法构建词典。
构建数据集类

#构建数据集
class TextDataset(Dataset):
    def __init__(self, word2idx, texts, labels, max_len) -> None:
        super().__init__()
        self.texts = texts
        self.labels = labels
        self.word2idx = word2idx
        self.max_len = max_len

    def __getitem__(self, index):
        text = self.texts[index][:self.max_len]
        label = int(self.labels[index])
        text_idx = [self.word2idx.get(t,1) for t in text]
        text_idx = text_idx + [0] * (self.max_len - len(text_idx))
        text_idx = torch.Tensor(text_idx).unsqueeze(0) # 新增一个维度
        return text_idx, label
    
    def __len__(self):
        return len(self.texts)

算了,就先写到这儿吧,反正也没啥人看hhh

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于Pytorch实现textcnn文本分类模型的代码,其中使用了CNN对文本进行卷积和池化,再经过全连接层进行分类。具体代码如下: ```python import torch import torch.nn as nn import torch.nn.functional as F class TextCNN(nn.Module): def __init__(self, vocab_size, embedding_dim, num_classes, filter_sizes, num_filters): super(TextCNN, self).__init__() self.embeddings = nn.Embedding(vocab_size, embedding_dim) self.convs = nn.ModuleList([ nn.Conv2d(1, num_filters, (fs, embedding_dim)) for fs in filter_sizes ]) self.fc = nn.Linear(num_filters * len(filter_sizes), num_classes) def forward(self, x): x = self.embeddings(x) # (batch_size, seq_len, embedding_dim) x = x.unsqueeze(1) # (batch_size, 1, seq_len, embedding_dim) x = [F.relu(conv(x)).squeeze(3) for conv in self.convs] # [(batch_size, num_filters, seq_len - filter_size + 1), ...] x = [F.max_pool1d(conv, conv.shape[2]).squeeze(2) for conv in x] # [(batch_size, num_filters), ...] x = torch.cat(x, 1) # (batch_size, num_filters * len(filter_sizes)) x = self.fc(x) # (batch_size, num_classes) return x ``` 其中,`vocab_size`表示词汇表大小,`embedding_dim`表示词向量维度,`num_classes`表示分类数目,`filter_sizes`表示卷积核大小,`num_filters`表示卷积核个数。 在`forward`函数中,首先将输入的文本通过词向量层进行转换,得到(batch_size, seq_len, embedding_dim)的张量。然后通过卷积层和池化层对文本进行特征提取,得到形状为(batch_size, num_filters * len(filter_sizes))的张量,最后通过全连接层进行分类

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值