前言

这篇博客以PTB数据集为例,详细讲解了如何将txt格式的数据集文件,转换为pytorch框架可以直接处理的tensor变量,并附上相应代码

@


1. PTB 数据集

PTB数据集含有三个txt文件,分别作为训练集(train),验证集(valid)和测试集(test);这三个txt文件分别包含42000,3000和3000句英文;

我们要将其转化为pytorch可处理的tensor类型数据集,需要以下几步:

  • 依次读取每一行的训练集文件(train.txt),为每一个读到的单词分配序号,构建词汇表

    • 出现频率低于min_ooc(通常默认为3)次的词汇,单词一率变为未知单词 < unk > ,分配序号1
    • < sos >为每句话的起始信号,分配序号2
    • < eos >为每句话的结束信号,分配序号3
    • 由于每句话长度不一样,而pytorch批处理数据,需要统一句子长度,因此长度较短的句子用 < pad > 填充,分配序号0
  • 统一句子长度为max_sentence_length(默认50)
    • 高于50个单词的句子,只保留前50个单词;
    • 低于50个单词的句子,用 < pad > 信号填充到50
  • 根据训练集构建的词汇表,将训练集,验证集和测试集都变成数字序号表示的句子,如 a cat not is dog变成 2 25 54 12 0 0
  • 构建三个数据集加载转换后的用数字序号表示的句子,并将其错位句子作为该句子的标签(target),例如, a cat not is dog变成 2 25 54 12 0 0, 那它对应的target就是 25 54 12 3 0 0 了 (2 3 分别为起始,末尾信号)
  • 将其转换为批处理的tensor变量

这样我们就能得到pytorch可以直接加载处理的tensor类型数据集了

2. 构建词汇表

我们先定义一个字典类型的变量,该字典类型变量,会将输入的句子里的新单词添加到字典中,并记录该单词的出现次数

引入库文件:

import json
import torch
import numpy as np
from nltk.tokenize import TweetTokenizer
from collections import Counter, OrderedDict,defaultdict
import io
import os
from torch.utils.data import DataLoader
class OrderedCounter(Counter, OrderedDict): #这样定义的字典类型变量,会将输入的句子里的新单词添加到字典中,并记录该单词的出现次数
"""Counter that remembers the order elements are first encountered"""
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, OrderedDict(self)) def __reduce__(self):
return self.__class__, (OrderedDict(self),)

依次读入ptb.train.txt的每一句话,并对其进行分词,不区分大小写;

  • 分词:由于默认可以通过空格来分开每个单词,但专业的分词函数更好些
def create_vocab(split):
tokenizer = TweetTokenizer(preserve_case=False) #分词,不区分大小写
w2c = OrderedCounter()
w2i = dict()
i2w = dict()
special_tokens = ['<pad>', '<unk>', '<sos>', '<eos>']
for st in special_tokens:
i2w[len(w2i)] = st
w2i[st] = len(w2i)
with open(split, 'r') as file:
for i, line in enumerate(file):
words = tokenizer.tokenize(line)
w2c.update(words) #这段程序将文件中出现过的所有单词加载到字典类型变量w2c中,并存储了他们出现的次数
for w, c in w2c.items():
if c > 3 and w not in special_tokens: #依次为出现次数大于3,且不是那4种特殊信号的单词分配序号
i2w[len(w2i)] = w
w2i[w] = len(w2i) #w2i格式为'cat':50这种,i2w为50:'cat'这种
return w2i,i2w

实例化一下试试:

3. 将训练集,验证集和测试集根据词汇表转换为数字序号,并转换为tensor

def create_data(split,w2i): #split为待转换的txt文件地址
tokenizer = TweetTokenizer(preserve_case=False) #分词,不区分大小写
data = defaultdict(dict)
with open(split, 'r') as file: #读取该文件的每一行
for i, line in enumerate(file):
words = tokenizer.tokenize(line) #分词
input = ['<sos>'] + words #输入的开头增加<sos>信号
input = input[:50] #只保留前50个(起始信号<sos> + 文本的前49个单词)
target = words[:50-1] #输入对应的target,也只保留50个(取文本的前49个单词+ 结束信号<eos>)
target = target + ['<eos>']
length = len(input)
input.extend(['<pad>'] * (50-length)) #输入和target,不足50个的,用<pad>补足50个
target.extend(['<pad>'] * (50-length))
input = [w2i.get(w, w2i['<unk>']) for w in input]
target = [w2i.get(w, w2i['<unk>']) for w in target]
id = len(data) #id表示该数据集的第id句话
inpu_t = torch.from_numpy(np.asarray(input)) #转换为tensor形式
targe_t = torch.from_numpy(np.asarray(target))
data[id]['input'] = inpu_t
data[id]['target'] = targe_t
data[id]['length'] = length
return data

实例化一下试试:

3. 转换为批处理的tensor变量

data_loader = DataLoader(
dataset= data,
batch_size= 64,#批处理大小
shuffle=True #是否打乱排序
)

实例化试试:

总结

这篇博客以PTB数据集为例,介绍了如何将txt形式的数据集转换为pytorch框架中可以使用的,批处理的tensor形式

参考项目:github上以PTB数据集训练的一个语言模型的项目

Pytorch加载txt格式的数据集文件(以PTB数据集为例)的更多相关文章

  1. Away3D 学习笔记(一): 加载3DS格式的模型文件

    加载外部的3DS文件分为两种: 1: 模型与贴图独立于程序的,也就是从外部的文件夹中读取 private function load3DSFile():Loader3D { loader = new ...

  2. pytorch 加载mnist数据集报错not gzip file

    利用pytorch加载mnist数据集的代码如下 import torchvision import torchvision.transforms as transforms from torch.u ...

  3. 神坑 Resources.Load 不能实时加载TXT文件

    Resources.Load(fileName) as TextAsset; 这句话并不能实时加载文本文件,对文本文件进行修改之后,若是没有刷新的话,加载的还是之前的文件: 要实时读取文本文件还是要以 ...

  4. hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)

    数据做压缩和解压缩会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,所以最好对那些I/O密集型的作业使用数据压缩,cpu密集型,使用压缩反而会降低性能. 而hive中间结果 ...

  5. 为不同分辨率单独做样式文件,在页面头部用js判断分辨率后动态加载定义好的样式文件

    为不同分辨率单独做样式文件,在页面头部用js判断分辨率后动态加载定义好的样式文件.样式文件命名格式如:forms[_屏幕宽度].css,样式文件中只需重新定义文本框和下拉框的宽度即可. 在包含的头文件 ...

  6. 使用getJSON()方法异步加载JSON格式数据

    使用getJSON()方法异步加载JSON格式数据 使用getJSON()方法可以通过Ajax异步请求的方式,获取服务器中的数组,并对获取的数据进行解析,显示在页面中,它的调用格式为: jQuery. ...

  7. cesium模型加载-加载fbx格式模型

    整体思路: fbx格式→dae格式→gltf格式→cesium加载gltf格式模型 具体方法: 1. fbx格式→dae格式 工具:3dsMax, 3dsMax插件:OpenCOLLADA, 下载地址 ...

  8. Lab_1:练习4——分析bootloader加载ELF格式的OS的过程

    一.实验内容 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代码和通过qemu来运行并调试bootloader&OS, bootloader如何读取硬盘扇 ...

  9. Lab1:练习四——分析bootloader加载ELF格式的OS的过程

    练习四:分析bootloader加载ELF格式的OS的过程. 1.题目要求 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代码和通过qemu来运行并调试bootl ...

  10. 如何实现通过Leaflet加载dwg格式的CAD图

    前言 ​ 在前面介绍了通过openlayers加载dwg格式的CAD图并与互联网地图叠加,openlayers功能很全面,但同时也很庞大,入门比较难,适合于大中型项目中.而在中小型项目中,一般用开源的 ...

随机推荐

  1. 重学SpringBoot. step7 高并发 秒杀

    高并发 高并发最容易出现的问题就是数据安全能不能得到保障. 你需要保证速度,又需要保证数据安全,那么速度也必然会有所下降. 所以最简单的办法就是提升硬件.或者把Mysql换成MongoDB,加个Red ...

  2. Python 元组列表排序:初学者可能忽视的细节

    P1085 [NOIP2004 普及组] 不高兴的津津 题目描述 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班.另外每周妈妈还会送她去学习朗诵.舞 ...

  3. C# 高德地图WebApi对接示例

    1.登录或注册高德地图开放平台然后申请应用key(需要认证个人或企业开发者) 高德开放平台 | 高德地图API (amap.com)https://developer.amap.com/?ref=ht ...

  4. Ubuntu/linux下最强大的下载工具-aria2

    aria2 是 Linux 下一个不错的高速下载工具 .由于它具有分段下载引擎,所以支持从多个地址或者从一个地址的多个连接来下载同一个文件.这样自然就大大加快了文件的下载速 度.aria2 也具有断点 ...

  5. ArcGIS Pro SDK 002 对数据文件的读取和操作

    做系统开发或者数据处理的时候,我一般还是喜欢使用文件数据源,例如矢量用.shp文件存储,栅格数据用.tif或者.img文件存储.ArcGIS Pro SDK中对数据源操作的API和ArcObjects ...

  6. KMP 算法(Knuth–Morris–Pratt algorithm)的基本思想

    KMP 算法(Knuth–Morris–Pratt algorithm)的基本思想 阅读本文之前,您最好能够了解 KMP 算法解决的是什么问题,最好能用暴力方式(Brute Force)解决一下该问题 ...

  7. gdbOF阅读笔记

    前言 今天阅读了一本说明书,<gdbOF: A Debugging Tool for OpenFOAM> 受himryangzz视频启发去读相关内容,在此对himryangzz表示感谢 希 ...

  8. sqlite3数据库Linux 系统移植和使用

    sqlite3数据库是一个小型的数据库,当数据量不大,要求不是特别高的时候,是个不错的选择. 在Linux上移植和使用也非常的方便. 本示例是在硬件全志r528 .linux5.4 上验证的. 移植操 ...

  9. pat乙级 1021个位数统计

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> ...

  10. 将现有vue项目基于electron打包成桌面应用程序 如何隐藏electron窗体的菜单栏

    一.前言 项目本来打算采用B/S架构去做的,浏览器网址方式打开还是让用户不方便: 二.使用electron集成桌面应用 本身项目是使用vue-cli开发的,在使用electron之前,需要将本身的项目 ...