构建文本数据集(tokenize、vocab)

  • 构建文本数据集
    • 文本清洗和读取
    • tokenize
    • 定义计数函数
    • 定义vocab类
    • 生成样本
      • 随机抽样生成样本
      • 按顺序生成样本
    • 封装

根据李沐老师的课做的记录。

构建文本数据集

文本数据集可以将其看作一串单词序列或者字符序列。
构建时一般有以下几个步骤。

  1. 文本清洗(比如去除乱码和标点符号、当然在很多时候并不会去掉标点符号)。
  2. 将文本存入内存。
  3. 将文本拆分成词或者字符。
  4. 建立词汇表和对应索引。

文本清洗和读取

这里使用课上提到的《time machine》
百度网盘链接
提取码:pypt

  1. 读取文本
    只保留字母并统一成小写。
text_path = './timemachine.txt'def read_time_machine():with open(text_path, 'r') as f:lines = f.readlines()return [re.sub(r'[^a-zA-Z]+', ' ', line).strip().lower() for line in lines]
lines = read_time_machine()
print('len=', len(lines), '\n', lines[0], '\n', lines[9])

输出如下

len= 3221
the time machine by h g wells
was expounding a recondite matter to us his grey eyes shone and

tokenize

将文本划分为词或者字符。

def tokenize(lines, token='word'):if token == 'word':return [line.split() for line in lines]elif token == 'char':return [list(line) for line in lines]else:print('wrong')
tokens = tokenize(lines)
print(tokens[0])

输出为

在这里插入代码片['the', 'time', 'machine', 'by', 'h', 'g', 'wells']

定义计数函数

统计每个词的出现频数。

def count_corpus(tokens):if len(tokens) == 0:tokens = []elif isinstance(tokens[0], list):tokens = [token for line in tokens for token in line]return collections.Counter(tokens)

定义vocab类

用于返回id_to_token和token_to_id。

class Vocab:def __init__(self, tokens=None, min_freq=0, reversed_token=None):if not tokens:tokens = []if not reversed_token:reversed_token = []counter = count_corpus(tokens)self.token_freq = sorted(counter.items(), key=lambda x: x[1], reverse=True)self.unk, uniq_tokens = 0, ['UNK'] + reversed_tokenuniq_tokens += [token for token, freq in self.token_freq if freq > min_freq and token not in uniq_tokens]self.idx_to_token, self.token_to_idx = [], {}for token in uniq_tokens:self.idx_to_token.append(token)self.token_to_idx[token] = len(self.idx_to_token) - 1def __len__(self):return len(self.idx_to_token)def __getitem__(self, tokens):if not isinstance(tokens, (list, tuple)):  # 判断是否为一个词语return self.token_to_idx.get(tokens, self.unk)return [self.__getitem__(token) for token in tokens]  # 如果为句子则以list形式返回def to_tokens(self, indices):  # 将id转为句子(主要用于多个id)if not isinstance(indices, (list, tuple)):  # 判断是否为一个idreturn self.idx_to_token[indices]return [self.idx_to_token[index] for index in indices]  # 如果为句子则以list形式返回
tokens = tokenize(lines)
vocab = Vocab(tokens, min_freq=2)
print(vocab['time'], vocab.to_tokens([1, 2, 3, 4, 5, 6]), len(vocab))

输出为

19 ['the', 'i', 'and', 'of', 'a', 'to'] 1420

生成样本

随机抽样生成样本

import random
import torch
# 随机抽样生成批量样本
def sequence_radom_iter(corpus, batch_size, num_step):#  随机起始corpus = corpus[random.randint(0, num_step - 1):]#  样例总数 -1 是因为要预测,对于最后一个x要保证有ysequence_num = (len(corpus)-1)//num_stepinit_index = list(range(0, sequence_num*num_step, num_step))random.shuffle(init_index)def data(pos):return corpus[pos: pos+num_step]num_batches = sequence_num//batch_sizefor i in range(0, batch_size*num_batches, batch_size):init_pre_batch_idex = init_index[i:i+batch_size]X = [data(i) for i in init_pre_batch_idex]Y = [data(i+1) for i in init_pre_batch_idex]yield torch.tensor(X), torch.tensor(Y)
data = sequence_radom_iter(vocab.__getitem__(corpus), 3, 5)
x, y = next(data)
print(x, '\n', y)

输出:

tensor([[ 119,    0,    0,    4,    0],[  11, 1170,    3,    0,  368],[   0,  348,  563,   51,  898]]) tensor([[   0,    0,    4,    0,    1],[1170,    3,    0,  368,    0],[ 348,  563,   51,  898,   95]])

按顺序生成样本

def sequence_data_seq(corpus, batch_size, num_step):#  随机起始corpus = corpus[random.randint(0, num_step - 1):]#  样例总数 -1 是因为要预测,对于最后一个x要保证有ysequence_num = (len(corpus) - 1) // batch_size * batch_sizeXs = torch.tensor(corpus[:sequence_num])Ys = torch.tensor(corpus[1:sequence_num+1])Xs, Ys = Xs.reshape(batch_size, -1), Ys.reshape(batch_size, -1)for i in range(0, Xs.shape[1]//num_step * num_step, num_step):X, Y = Xs[:, i: i + num_step], Ys[:, i: i + num_step]yield X, Y
data = sequence_data_seq(vocab.__getitem__(corpus), 3, 5)
x, y = next(data)
print(x, '\n', y)
testData = list(range(100))
data = sequence_data_seq(testData, 3, 5)
x, y = next(data)
print(x, '\n', y)

输出:

tensor([[ 19,  50,  40,   0,   0],[  4,   1,  56,   0, 799],[ 11, 180,  63,   6,  13]]) tensor([[ 50,  40,   0,   0, 400],[  1,  56,   0, 799,   4],[180,  63,   6,  13,   9]])tensor([[ 3,  4,  5,  6,  7],[35, 36, 37, 38, 39],[67, 68, 69, 70, 71]]) tensor([[ 4,  5,  6,  7,  8],[36, 37, 38, 39, 40],[68, 69, 70, 71, 72]])

封装

class SeqDataLoader:def __init__(self, tokens, batch_size, num_steps, use_random_iter):if use_random_iter:self.data_iter_fn = sequence_radom_iterelse:self.data_iter_fn = sequence_seq_iterself.batch_size = batch_sizeself.num_steps = num_stepsself.vocab = Vocab(tokens, min_freq=2)self.corpus = self.vocab.__getitem__([token for line in tokens for token in line])def __iter__(self):return self.data_iter_fn(self.corpus, self.batch_size, self.num_steps)def load_text(tokens, batch_size, num_steps, use_random_iter=False):iter = SeqDataLoader(tokens, batch_size, num_steps, use_random_iter)return iter, iter.vocab
lines = read_time_machine()
tokens = tokenize(lines, token='char')data_iter, vocab = load_text(tokens, 4, 20)
print(next(data_iter.__iter__()))
(tensor([[ 2,  1, 13,  4, 15,  9,  5,  6,  2,  1, 21, 19,  1,  9,  1, 18,  1, 17,2, 12],[17,  4, 19,  1, 17,  4,  8,  1, 10,  5, 15,  9, 12, 19,  1, 15,  4, 10,22,  2],[ 1,  3,  9,  5,  8,  1, 21, 12,  2,  4, 15,  9,  2, 11,  7, 21,  8, 15,2,  6],[ 2,  1,  4,  1, 18, 10,  2,  4,  3,  1,  2, 16, 16,  7, 10,  3,  1,  7,16,  1]]), tensor([[ 1, 13,  4, 15,  9,  5,  6,  2,  1, 21, 19,  1,  9,  1, 18,  1, 17,  2,12, 12],[ 4, 19,  1, 17,  4,  8,  1, 10,  5, 15,  9, 12, 19,  1, 15,  4, 10, 22,2, 11],[ 3,  9,  5,  8,  1, 21, 12,  2,  4, 15,  9,  2, 11,  7, 21,  8, 15,  2,6,  2],[ 1,  4,  1, 18, 10,  2,  4,  3,  1,  2, 16, 16,  7, 10,  3,  1,  7, 16,1, 13]]))

构建文本数据集(tokenize、vocab)相关推荐

  1. ArcGIS网络分析之构建网络分析数据集(一)

    说明: 1. 本文主要用于演示网络分析服务的搭建过程.所以在此不会深入讨论网络分析服务的每一个细节,本文的目的就是让初学者学会使用网络分析服务进行基本的分析(主要针对后续的WEB开发):路径分析,最近 ...

  2. NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练、测试(某个单词的相关词汇)

    NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练.测试(某个单词的相关词汇) 目录 输出结果 设计思路 核心代码 输出结果 寻找训练文本中与morning最相关的10个词汇: ...

  3. 使用马尔可夫链构建文本生成器

    本文中将介绍一个流行的机器学习项目--文本生成器,你将了解如何构建文本生成器,并了解如何实现马尔可夫链以实现更快的预测模型. 文本生成器简介 文本生成在各个行业都很受欢迎,特别是在移动.应用和数据科学 ...

  4. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、基于自定义函数构建xgboost文本分类模型

    R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.基于自定义函数构建xgboost文本分类模型 目录

  5. R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理、构建词袋模型、构建xgboost文本分类模型、基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化

    R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理.构建词袋模型.构建xgboost文本分类模型.基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化 目录

  6. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、xgboost模型预测推理并使用混淆矩阵评估模型、可视化模型预测的概率分布

    R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.xgboost模型预测推理并使用混淆矩阵评估模型.可视化模型预测的概率分布 目录

  7. 清华构建新一代数据集NICO,定义图像分类新标准

    2020-08-15 01:59:36 每件事物的出现都有它各自的使命,我们今天提数据集就不得不提到ImageNet,ImageNet数据集及其它推动的大规模视觉比赛对人工智能特别是计算机视觉领域的巨 ...

  8. ArcGIS10.2 网络分析之路径分析(二)---构建网络数据集

    2.构建网络数据集 要素集---右键---新建---网络数据集 输入网络数据集的名称,选择网络数据集的版本,默认最高即可: 选择用于生成网络数据集的要素类(有其他数据也可以选上,利于后面分析的准确性) ...

  9. Dataset:fetch_20newsgroups(20类新闻文本)数据集的简介、安装、使用方法之详细攻略

    Dataset:fetch_20newsgroups(20类新闻文本)数据集的简介.安装.使用方法之详细攻略 目录 fetch_20newsgroups(20类新闻文本)数据集的简介 1.数据集信息 ...

最新文章

  1. Windows Server 2012 R2 WSUS-11:经典的客户端排错操作
  2. 正确的WordPress文件权限[关闭]
  3. POJ 1172 DFS
  4. apache php 重写url无效,apache用rewrite重写url时出现问题
  5. android 说出密码,关于未来的住宅的作文400字5篇
  6. 股票分析之主力资金排序分析
  7. 手把手教你用Spring Cloud和Docker构建微服务
  8. Windows XP启用telnet服务图文教程
  9. cat 监控 java,分布式监控CAT客户端的SpringBoot集成
  10. 线性调频信号(Chirp信号)公式
  11. 计算机开机切换用户界面,win7开机登录界面怎么设置?win7更换开机画面壁纸解决办法...
  12. 高压直流电源为什么要“接地”?如何“接地”?
  13. 台式电脑脑计算机没法启动怎么办,台式机主机电源灯不亮,开不了机怎么办? 台式电脑无法开机什么原因...
  14. 蚂蚁算法python_蚁群算法python编程实现
  15. Android重写ImageView实现图片镜像效果
  16. matlab url什么意思,URL是什么 url是什么意思?
  17. sql注入的原理详解
  18. MAC地址绑定(交换机命令大全)
  19. 外卖跑腿app源码,小程序上点餐+送货二合一
  20. DaVinci Resolve Advanced Panel达芬奇调色台

热门文章

  1. djkk电子书内测价998元 限量3500台
  2. 三,vagrant配置Docker完整教程
  3. 【仿真模拟】关于matlab快速跑数据至excel
  4. 信息技术用计算机做科学实验报告,信息技术在批阅实验报告数据处理中的应用...
  5. 万恶的莆田系医院,我也来一发!!!
  6. 使用 Java 启动新的应用
  7. 物联网 探秘零售业的“芯”机遇
  8. 利用Java基础知识+简单封装写一个银行登录存取款系统
  9. 【计算机网络微课堂】
  10. C语言笔记:数制与进制(数制)之间转换问题