记录自己在使用PyTorch及其相关框架时遇到的问题和解决方法。
torchtext数据预处理
torchtext是一个PyTorch的非官方的框架,用来处理NLP中数据加载的任务。torchtext为文本数据的读取提供了很好的pipeline,可以方便的把数据送给PyTorch。但是其功能实现上存在着一些bug,仍存在着大量的坑。本节利用torchtext讲述从数据的读取到生成Batch的过程,方便以后的复习使用。
torchtext读取数据
首先导入相应的框架。
1 | import jieba |
定义分词函数。分词函数使用结巴分词的lcut函数,得到分词后的列表。
1 | def tokenizer(text): |
定义torchtext.data.Field
。Field类似于数据库中的域,像是一个规则,把数据限定在这个规则下。
1 | TEXT = data.Field(sequential=True, tokenize=tokenizer) |
读取CSV数据
获取训练集和验证集时可以torchtext.data.TabularDataset.splits
这个函数,若待读取的数据为如下的CSV文件时:
1 | id,content,label |
torchtext读取的方法为:
1 | train_data, valid_data, test_data = data.TabularDataset.splits( |
CSV数据是以英文,
来分隔数据的,但是文本数据中很大概率存在大量英文,
,很容易导致读取数据时产生意外的问题。
读取JSON数据
在读取torchtext所理解的”JSON”数据时会遇到坑。torchtext加载数据时有可能是按行去读取,所以并不能处理传统意义上的JSON数据,torchtext所理解的”JSON”数据是每一行为一个Python中的字典:
1 | {"id": 1, "content": "妞妞啊,今天又承办了一个发文登记文号是126~嘻~么么哒~晚安哟", "label": "happy"} |
针对以上数据,torchtext的解决方法为:
1 | train_data, valid_data = data.TabularDataset.splits( |
上述JSON数据不是标准的JSON格式,还需要把数据处理成上述格式才能调用函数。所以对于JSON数据还是自己定义DataLoader比较好。
自定义DataLoader
自定义DataLoader的主要思想是首先手动读取数据,然后把数据构造成torchtext.data.Example
,再利用torchtext.data.Dataset
构造成数据集。
1 | import json |
打印一下:
1 |
|
结果:
1 | {'text': ['气死', '姐姐', '了', ',', '快二是', '阵亡', '了', '吗', ',', '尼玛', ',', '一个半', '小时', '过去', '了', '也', '没', '上车'], 'label': 'angry'} |
可以看出train_data和valid_data都有label,test_data没有label。
torchtext构建Vocab(单词表)
对train_data构建Vocab
1 | TEXT.build_vocab(train_data) |
结果
1 | dict_keys(['freqs', 'itos', 'unk_index', 'stoi', 'vectors']) |
构建迭代器
利用torchtext.data.BucketIterator
和torchtext.data.Iterator
构建迭代器
1 | train_iter = data.BucketIterator(dataset=train_data, batch_size=64, shuffle=True, sort_within_batch=False, repeat=False) |
构建LSTM
构建LSTM模型
1 | # 定义LSTM |
训练数据
1 | model=LSTM() |
完整代码如下:
1 | import torch |
参考:
TorchText用法示例及完整代码
Pytorch学习记录-更深的TorchText学习01
Pytorch学习记录-torchtext数据预处理
TorchText使用
Torchtext读取JSON数据
使用pytorch和torchtext进行文本分类