9.1 文本预处理
文本数据是常见的序列模型,使用序列模型对文本数据进行训练前,需要对文本进行预处理,主要是对单词进行编码,使得其能适应模型的输入。预处理的基本步骤如下:
-
将文本作为字符串加载到内存中。
-
将字符串拆分为词元(如单词和字符)。
-
建立一个词表,将拆分的词元映射到数字索引。
-
将文本转换为数字索引序列,方便模型操作。
这里使用时光机器本文,首先读取文本内容,并对不是字母和空格的数据进行删除。
d2l.DATA_HUB['time_machine']=(d2l.DATA_URL+'timemachine.txt','090b5e7e70c295757f55df93cb0a180b9691891a')
def read_time_machine():
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])
#输出:
文本总数:3221
the time machine by h g wells
将文本拆分成一个词元列表,词元(token)是文本的基本单位,最后,返回一个由词元列表组成的列表,其中的每个词元都是一个字符串(string)。
def tokenize(lines, token='word'): #@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(2):
print(tokens[i])
#输出:
['the', 'time', 'machine', 'by', 'h', 'g', 'wells']
[]
对所有的词构建一个字典,保存每个词以及其索引。先将训练集中的所有文档合并在一起,对它们的唯一词元进行统计, 得到的统计结果称之为语料(corpus)。然后根据每个唯一词元的出现频率,为其分配一个数字索引。很少出现的词元通常被移除,这可以降低复杂性。 另外,语料库中不存在或已删除的任何词元都将映射到一个特定的未知词元“<unk>”。 我们可以选择增加一个列表,用于保存那些被保留的词元。这里对时光机器本文来构建语料库。
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)
self.idx_to_token = ['<unk>'] + reserved_tokens
self.token_to_idx = {token:idx for idx,token in enumer

文本预处理是序列模型训练的重要步骤,包括加载文本、拆分词元、建立词表和转换为数字序列。时光机器文本数据经过处理,创建词表并统计词频,显示出词频分布遵循齐普夫定律。语言模型用于估算文本序列的概率,适用于文本生成和自动联想。随机抽样和顺序分区是两种数据加载策略,用于生成训练小批量。最后,提供了加载时光机器数据集的函数,返回数据迭代器和词表。
最低0.47元/天 解锁文章
816

被折叠的 条评论
为什么被折叠?



