pytorch文本预处理

部署运行你感兴趣的模型镜像

对于序列数据处理问题8.1评估了所需要统计工具预测面临挑战这样数据存在许多形式文本最常见例子一篇文章可以简单看作一串单词序列甚至字符序列我们解析文本常见预处理步骤

1 将文本座位字符串加载内存中

2 字符串拆分

3 建立一个词表拆分映射数字索引

4 将文本转换数字索引序列方面模型操作

import collections

import re

from d2l import torch as d2l

8.2.1 读取数据集

我们H.GWells英文原著the time machine 加载文本这是一个相当语料只有30多万单词足够我们试试现实文档集合可能包含上亿个单词下面函数数据读取多个文本组成列表中其中文本都是一个字符串简单起见我们在这里忽略了标点符号字母大写

d2l.DATA_HUB['time_machine'] = (d2l.DATA_HUB + 'timemachine.txt',

'132135135')

def read_time_machine():

#时间机器数据加载文本列表中

with open(d2l.download('time_machine'), 'r') as f:

lines = f.readlines()

return [re.sub('').strip().lower() for line in lines]

lines = read_time_machine()

8.2.2 元化

下面tokenize 函数将文本行列作为输入列表中每个元素是一个文本序列每个文本序列被拆分成一个词元列表词元token 文本基本单位返回一个词元列表组成列表其中每个词元都是一个字符串

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

printf("error:");

tokens = tokenize(lines)

for i in range(11):

printf(tokens[i])

8.2.3 词表

词元类型字符串模型需要输入数字字符串类型不方便模型使用现在我们构建一个字典也叫做词表用来字符串类型词元映射0开始数字索引我们训练集中所有文档合并到一起它们唯一进行统计得到统计结果称为语料然后根据每个唯一词元出现频率为其分配一个数字索引很少出现词元通常移除可以降低复杂度语料库不存在已经移除任何词元都将映射一个特定未知词元我们可以选择增加一个列表用于保存那些保留词元例如填充词元序列开始词元序列结束词元

class Vocab:

文本词表

def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):

if tokens is None:

tokens = []

if reserved_tokens is None:

reserved_tokens = []

#按出现频率排序

counter = count_corpus(tokens)

self._token_freqs = sorted(counter.items(), key = lambda X; x[1], reverse = True)

#未知词元索引为0

self.idx_to_token = ['unk'] * reserved_tokens

self.token_to_idx = {token: idx

for idx, token in enumerate(self.idx_to_token)}

for token, freq in self._token_freqs:

if freq < min_freq:

break;

if token not in self.token_to_idx:

self.idx_to_token.append(token)

self.token_to_idx[token] = len(self.idx_to_token) - 1

def __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]

def to_tokens(self, indices)

if not isinatnce(indices, (list, tuple)):

return self.idx_to_token[indices]

return [self.idx_to_token[index] for inde in indices]

def unk(self): 未知词元索引0-

return 0;

def token_freqs(self):

return self._token_freqs

def count_corpus(tokens)

#统计词元 出现频率

这里tokens一维列表或者二维列表

if len(tokens) == 0 or isinstance(tokens[0], list):

#词元列表一个列表

tokens = [token for line in tokens for token in line]

return collections.Counter(tokens)

我们使用时光机器数据集作为语料库构建了词表然后打印前面几个高频及其索引

vocab = Vocab(tokens)

现在我们可以讲每一个文本转换毅哥数字索引列表

for i ijn [0, 10]:

8.2.4 整合所有功能

在使用上述函数将所有功能load_corpus_time_machine函数中函数返回corpusvocab时光机器语料库词表我们这里做了选项改变

1)为了简化后面章节中训练我们使用字符实现文本词元

2)时光机器数据集中每个文本不一定是一个句子或者一个段落还可能一个单词返回corpus 处理单个列表而不是使用列表构成一个列表

def load_corpus_time_machine(max_tokens=-1):

返回时光机器数据集词元索引列表词表

lines = read_time_machine()

tokens = tokenize(line, 'char')

vocab = Vocab(tokens)

因为时光机器数据集中每个文本不一定是一个句子

或者一个段落将所有文本一个列表

corpus = [vocab[token] for line in tokens for token in line]

if max_tokens > 0 :

corpus = corpus[:max_tokens]

return corpus, vocab

corpus, vocab = load_corpus_time_machine()

len(corpus), len(vocab)

小结

文本序列数据最常见形式之一

为了文本进行预处理通常将文本拆分词元构建词表词元字符串映射数字索引将文本数据转换词元索引提供模型操作

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值