石家庄网站建设云图大连网站程序开发
news/
2025/10/5 11:53:21/
文章来源:
石家庄网站建设云图,大连网站程序开发,做网站如何买量,深圳网站建设犀牛云import collections
import re
from d2l import torch as d2l解析文本的常见预处理步骤#xff1a; 将文本作为字符串加载到内存中。 将字符串拆分为词元#xff08;如单词和字符#xff09;。 建立一个词表#xff0c;将拆分的词元映射到数字索引。 将文本转换为数字索…import collections
import re
from d2l import torch as d2l解析文本的常见预处理步骤 将文本作为字符串加载到内存中。 将字符串拆分为词元如单词和字符。 建立一个词表将拆分的词元映射到数字索引。 将文本转换为数字索引序列方便模型操作。
8.2.1 读取数据集
本文从 H. G. Wells 的《时光机器》一书的英文原著 The Time Machine 中加载文本它只有30000多个单词。
#save
d2l.DATA_HUB[time_machine] (d2l.DATA_URL timemachine.txt,090b5e7e70c295757f55df93cb0a180b9691891a)def read_time_machine(): #save将时间机器数据集加载到文本行的列表中with open(d2l.download(time_machine), r) as f:lines f.readlines()return [re.sub([^A-Za-z], , line).strip().lower() for line in lines]lines read_time_machine()
print(f# 文本总行数: {len(lines)})
print(lines[0])
print(lines[10])# 文本总行数: 3221
the time machine by h g wells
twinkled and his usually pale face was flushed and animated the8.2.2 词元化
词元token 是文本的基本单位。tokenize 函数将文本行列表作为输入列表中的每个元素是一个文本序列。每个文本序列又被拆分成一个词元列表最后返回一个由词元列表组成的列表。
def tokenize(lines, tokenword): #save将文本行拆分为单词或字符词元if token word:return [line.split() for line in lines]elif token char:return [list(line) for line in lines]else:print(错误未知词元类型 token)tokens tokenize(lines)
for i in range(11):print(tokens[i])[the, time, machine, by, h, g, wells]
[]
[]
[]
[]
[i]
[]
[]
[the, time, traveller, for, so, it, will, be, convenient, to, speak, of, him]
[was, expounding, a, recondite, matter, to, us, his, grey, eyes, shone, and]
[twinkled, and, his, usually, pale, face, was, flushed, and, animated, the]8.2.3 词表
字符串类型的词元需要转换成模型需要的数字输入。 首先构建一个词表vocabulary将字符串类型的词元映射到从 0 开始的数字索引中。 先将训练集中的所有文档合并在一起进行唯一词元统计得到的统计结果称之为语料corpus。 然后根据每个唯一词元的出现频率为其分配一个数字索引。 移除很少出现的词元通常以降低复杂性。 将语料库中不存在或已删除的任何词元都映射到一个特定的未知词元“unk”。 可以选择增加一个列表用于保存那些被保留的词元例如填充词元“pad” 序列开始词元“bos” 序列结束词元“eos”。
class Vocab: #save文本词表def __init__(self, tokensNone, min_freq0, reserved_tokensNone):if tokens is None:tokens []if reserved_tokens is None:reserved_tokens []counter count_corpus(tokens)self._token_freqs sorted(counter.items(), keylambda x: x[1], # 按出现频率排序reverseTrue)self.idx_to_token [unk] reserved_tokens # 下标对应词源 未知词元的索引为0self.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: # 跳过频率过低的词breakif 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 isinstance(indices, (list, tuple)):return self.idx_to_token[indices]return [self.idx_to_token[index] for index in indices]propertydef unk(self): # 未知词元的索引为0return 0propertydef token_freqs(self):return self._token_freqsdef count_corpus(tokens): #save统计词元的频率# 这里的tokens是1D列表或2D列表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) # 使用时光机器数据集作为语料库来构建词表
print(list(vocab.token_to_idx.items())[:10]) # 打印前几个高频词元及其索引for i in [0, 10]: # 将每一条文本行转换成一个数字索引列表print(文本:, tokens[i])print(索引:, vocab[tokens[i]])[(unk, 0), (the, 1), (i, 2), (and, 3), (of, 4), (a, 5), (to, 6), (was, 7), (in, 8), (that, 9)]
文本: [the, time, machine, by, h, g, wells]
索引: [1, 19, 50, 40, 2183, 2184, 400]
文本: [twinkled, and, his, usually, pale, face, was, flushed, and, animated, the]
索引: [2186, 3, 25, 1044, 362, 113, 7, 1421, 3, 1045, 1]8.2.4 整合所有功能
将所有功能打包到 load_corpus_time_machine 函数中返回 corpus词元索引列表和 vocab时光机器语料库的词表。
在这里所做的改变是 使用字符而不是单词实现文本词元化以简化后面章节中的训练 时光机器数据集中的每个文本行不一定是一个句子或一个段落还可能是一个单词因此返回的corpus仅处理为单个列表而不是使用多词元列表构成的一个列表。
def load_corpus_time_machine(max_tokens-1): #save返回时光机器数据集的词元索引列表和词表lines read_time_machine()tokens tokenize(lines, 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, vocabcorpus, vocab load_corpus_time_machine()
len(corpus), len(vocab)(170580, 28)练习
1词元化是一个关键的预处理步骤它因语言而异。尝试找到另外三种常用的词元化文本的方法。 BPEByte-Pair Encoding WordPiece SentencePiece 2在本节的实验中将文本词元化为单词并更改 Vocab 实例的 min_freq 参数。这对词表大小有何影响
lines read_time_machine()
tokens tokenize(lines, word)
vocab Vocab(tokens, min_freq3)
corpus [vocab[token] for line in tokens for token in line]
if -1 0:corpus corpus[:-1]len(corpus), len(vocab)(32775, 1420)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928217.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!