基于LSTM的文本分类任务-学习笔记

项目介绍:

本项目旨在探索和实现一个基于LSTM的文本分类模型。通过构建和训练一个LSTM网络,我们将尝试解决一个具体的文本分类问题,并评估模型的性能。项目将涵盖数据预处理、模型设计、训练、评估以及结果分析等关键步骤,以期达到对LSTM在文本分类任务中应用的深入理解。

本篇博客是对唐宇迪ai的学习笔记。

欢迎大家加群一起讨论,群号:972252910。群二维码在本篇博客最底下。

源码地址:

pytorch_learning/TextClassification at 8278cd78c98509a4782848f1389baa646b008fc4 · Ol1ver0413/pytorch_learning · GitHub

环境介绍:

cuda:12.1

python:3.9.2

torch:2.1.0+cu121

TorchVision version: 0.16.0+cu121

文件介绍:

tain.txt训练集 text.txt测试集 dev.txt验证集

vocab.pkl 语料表 {字:ID}

embedding_SougouNews.npz embedding_Tencent.npz 映射表(embedding表) {ID:向量},.npz是一个numpy数组文件格式,是.npy的ZIP压缩文件

class.txt 类表表

预训练词嵌入:通过大规模文本语言分析内在的语义信息和上下文结构,将单词转化为词向量

run.py主要运行的脚本

utils.py加载数据集,用于分词分句

TextRNN.py 神经网络结构

模型执行框架: 

1.  导入库函数和包

2.  通过argparse写入model(模型类型),embedding(与训练参数),word(按字分类)

导入TextRNN.py模块,这个模块定义了网络结构

Config类:配置了基本的参数,例如各种的文件路径,提取了预训练词向量,mini-batch,学习率,训练层数等

我们修改Config里的配置参数,之后我们需要进行比较,因此我们需要保证随机初始化的权重参数固定,将随机种子固定

3.  通过utils模块中的build_dataset函数,将训练集,验证机和测试集里每一句的文字内容通过词汇表转化为标识符(索引值)

按字分类 + 加载词汇表 + 按行对文本对象的每一行进行处理分割出文本数据和标签 + 多截少补 + 返回转化为向量的数据传给run.py

4.  通过utils模块中的DatasetIterater类和build_iterator函数,将数据集,验证集,测试集构造成批次为128的迭代器

5.  通过Model类定义一个神经网络模型以及前相传播过程

6.  网络模型结构:Embedding层 – LSTM层 – FC层

7.  开启训练集训练模式,保存最好的一次训练结果的权重参数

开启测试模式,验证集或测试集上评估模型的性能

代码段解释:

1.  写定一组参数,以便脚本后续可以直接使用

parser = argparse.ArgumentParser(description='Chinese Text Classification')
创建一个ArgumentParser对象,并设置一个描述信息

parser.add_argument('--model', type=str, required=True, help='choose a model: TextCNN, TextRNN, FastText, TextRCNN, TextRNN_Att, DPCNN, Transformer')
添加一个命令行参数名
--model为命令行参数名 required=True代表必须得填入 help=‘ ‘为提示信息
执行run.py --help会提示信息

args = parser.parse_args()
解析命令行参数,此时命令行的参数,例如--model,--embedding为args的属性,可以直接args.model直接调用

这一段选择了TextRNN模型+预训练参数+按字分类

2.  读取列表

[x.strip() for x in open(dataset + '/data/class.txt').readlines()]

这是一个列表推导式
open(dataset + '/data/class.txt') 打开一个文件对象
open(dataset + '/data/class.txt').readlines() 读取该文件的每一行,并作为一个字符串列表返回,每行末尾带一个\n
for x in open(dataset + '/data/class.txt').readlines() 遍历每一行的内容
x.strip() 去除字符串两端空白字符

3.  提取与训练词向量

self.embedding_pretrained = torch.tensor(
           np.load(dataset + '/data/' + embedding)["embeddings"].astype('float32'))\
           if embedding != 'random' else None

np.load() 加载numpy数组格式文件
[embeddings] 提取embeddings键值所对应的向量,大小为4762*300,4762为文字个数,300为词向量维度大小,并且这些都是预训练好的
.astype('float32') 将数据类型转化为float32
torch.tensor() 将数据类型转化为tensor(张量)

4.  按词/字分类

if ues_word:
tokenizer = lambda x: x.split(' ')     
按词分类,以空格隔开,word-level

vocab = build_vocab(config.train_path, tokenizer=tokenizer, max_size=MAX_VOCAB_SIZE, min_freq=1)
创建词汇表,训练数据文件路径,tokenenizer为分词器,max_size词汇表最大大小,min_freq最小出现频率
训练的逻辑是,打开文件,按行开始读取,第一个出现的字是1,第二个是2,以此类推

pkl.dump(vocab, open(config.vocab_path, 'wb'))
print(f"Vocab size: {len(vocab)}")

5.  DatasetIterater类

_iter_(self)首先被调用,返回一个迭代器实例
_next_(self)被调用,每次返回一个批次的数据;并在内部调用_to_tensor(self,dats)的方法,将批次数据转化为张量
当数据迭代完毕时,__next__(self) 方法抛出 StopIteration 异常,结束迭代

当你调用 len(dataset_iter) 时,Python 会查找 dataset_iter 对象的 __len__ 方法
允许外部代码查询迭代器总长度

6.  创建embedding层

self.embedding = nn.Embedding.from_pretrained(config.embedding_pretrained, freeze=False)
nn.Embedding.from_pretrained() 创建一个Embedding层,通过与训练好权重进行初始化,可以理解为读取一个已经训练好的Embedding表
(config.embedding_pretrained,freeze=False)其中参数0代表词汇表,参数1代表不需要更新权重参数

self.embedding = nn.Embedding(config.n_vocab, config.embed, padding_idx=config.n_vocab - 1)
创建一个查找表,每一行代表一个词的嵌入向量,列数为嵌入向量的维度
config.n_vocab - 1 作为填充索引,意味着词汇表中的最后一个单词被用作填充向量

embedding层是一个将输入数据转化为向量的技术。在前向传播中,通常会先将输入数据(例如单词)转化为词汇表中的索引,再通过索引在查找表中转化为向量

查找表是一个可学习的权重参数,通过不断地学习,来更新每个词向量

7.  创建一个LSTM层

self.lstm = nn.LSTM(config.embed, config.hidden_size, config.num_layers,bidirectional=True, batch_first=True, dropout=config.dropout)
创建一个lstm层
config.embed为输入向量维度,config.hidden_size为输出向量维度
config.num_layers,bidirectional=True代表开启双向模式,会将两个向量合在一起,因此输出向量为256
batch_first=True输入和输出的Tensor形状格式(True表示输入的第一个维度是batch size)输入Tensor格式为(batch_size, seq_len, embed),输出形式为(batch_size, seq_len, hidden_size * num_directions)           
(批次大小 * 输入序列长度 维度)

dropout代表丢弃神经元

8.  前向传播

metrics.accuracy_score() 是 scikit-learn 库中用于计算分类任务准确度的函数
它计算的是模型预测正确的样本数占总样本数的比例,即准确度

结果展示:

结语:

在本篇学习笔记中,我们深入探讨了基于LSTM的文本分类任务,从理论基础到实践应用,每一步都旨在提升我们对深度学习在自然语言处理领域应用的理解。希望这些知识能够为你在文本分类领域的探索提供坚实的基础,并激发你进一步研究和创新的热情。

本人也是在学习AI的道路上,欢迎大家提出问题和分享答案。

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值