文本预处理
对于序列数据处理问题,我们在 上一节 中评估了所需的统计工具和预测时面临的挑战。这样的数据存在许多种形式,文本是最常见例子之一。例如,一篇文章可以被简单地看作一串单词序列,甚至是一串字符序列。本节中,我们将解析文本的常见预处理步骤。这些步骤通常包括:
- 将文本作为字符串加载到内存中。
- 将字符串拆分为词元(如单词和字符)。
- 建立一个词表,将拆分的词元映射到数字索引。
- 将文本转换为数字索引序列,方便模型操作。
读取数据集
首先,我们从H.G.Well 的时光机器中加载文本。这是一个相当小的语料库,只有30000多个单词,但足够我们小试牛刀,而现实中的文档集合可能会包含数十亿个单词。下面的函数将数据集读取到由多条文本行组成的列表中,其中每条文本行都是一个字符串。为简单起见,我们在这里忽略了标点符号和字母大写。
词元化
下面的 tokenize
函数将文本行列表(lines
)作为输入,列表中的每个元素是一个文本序列(如一条文本行)。每个文本序列又被拆分成一个词元列表,词元(token)是文本的基本单位。最后,返回一个由词元列表组成的列表,其中的每个词元都是一个字符串(string)。
词表
词元的类型是字符串,而模型需要的输入是数字,因此这种类型不方便模型使用。现在,让我们构建一个字典,通常也叫做词表(vocabulary),用来将字符串类型的词元映射到从 0 开始的数字索引中。
我们先将训练集中的所有文档合并在一起,对它们的唯一词元进行统计,得到的统计结果称之为语料(corpus)。然后根据每个唯一词元的出现频率,为其分配一个数字索引。很少出现的词元通常被移除,这可以降低复杂性。另外,语料库中不存在或已删除的任何词元都将映射到一个特定的未知词元 <unk>
。我们可以选择增加一个列表,用于保存那些被保留的词元,例如:填充词元(<pad>
);序列开始词元(<bos>
);序列结束词元(<eos>
)。
我们首先使用时光机器数据集作为语料库来构建词表,然后打印前几个高频词元及其索引。
现在,我们可以将每一条文本行转换成一个数字索引列表。
整合所有功能
在使用上述函数时,我们将所有功能打包到 load_corpus_time_machine
函数中,该函数返回 corpus
(词元索引列表)和 vocab
(时光机器语料库的词表)。我们在这里所做的改变是:
- 为了简化后面章节中的训练,我们使用字符(而不是单词)实现文本词元化;
- 时光机器数据集中的每个文本行不一定是一个句子或一个段落,还可能是一个单词,因此返回的
corpus
仅处理为单个列表,而不是使用多词元列表构成的一个列表。
小结
- 文本是序列数据的一种最常见的形式之一。
- 为了对文本进行预处理,我们通常将文本拆分为词元,构建词表将词元字符串映射为数字索引,并将文本数据转换为词元索引以供模型操作。
练习
- 词元化是一个关键的预处理步骤,它因语言而异。尝试找到另外三种常用的词元化文本的方法。
- 在本节的实验中,将文本词元为单词和更改
Vocab
实例的 min_freq
参数。这对词表大小有何影响?
Discussions