Appearance
预训练词嵌入数据集
一、概述
这个章节是为我们之前学的 word2vec 词嵌入模型准备训练用的数据集,我们用的是]Penn Tree Bank(PTB)数据集,这个数据集是从《华尔街日报》的文章里提取出来的,分成了训练集、验证集和测试集。我们会把原始的文本数据转换成可以批量训练的格式,方便后续训练 word2vec 模型。
二、读取数据集
首先我们用 d2l 的工具下载并读取 PTB 数据集,把每一行文本按空格拆分成单词,这样就得到了一个句子列表,每个句子都是一个单词的列表。比如原始的一行文本是 "hello world this is a test",拆分后就是 ["hello", "world", "this", "is", "a", "test"]。
然后我们要构建一个词表,把出现次数少于 10 次的单词都换成<unk>(未知词),这样可以减少词表的大小,避免处理太稀有的单词。比如某个单词只出现了 5 次,我们就把它换成<unk>,表示这个单词是未知的。
三、下采样:给高频词 “减肥”
在文本数据里,有很多高频词,比如 "the"、"a"、"in" 这些,它们在语料库里可能出现数十亿次,但是这些词和很多不同的单词一起出现,提供的有用信息很少。比如 "chip" 这个词,它和低频词 "intel" 一起出现,比和高频词 "a" 一起出现更有价值,因为 "a" 和很多单词都一起出现,没法提供独特的信息。而且高频词太多会让训练速度变慢。
所以我们要对高频词进行下采样,也就是有概率丢弃这些高频词。丢弃的概率是这样计算的:
- 首先计算这个词的频率(这个词出现的次数除以总词数)
- 如果这个频率超过一个阈值(比如 1e-4),就有概率丢弃这个词,频率越高,丢弃的概率越大。
比如 "the" 这个词,出现频率很高,就有很大概率被丢弃,这样我们就可以减少训练的计算量,还能让模型更关注那些有用的低频词。
四、提取中心词和上下文词:找主角和配角
接下来我们要从句子里提取训练用的样本,每个样本是 “中心词 - 上下文词” 对,也就是把每个单词当成中心词(主角),把它周围的单词当成上下文词(配角)。
我们可以设置一个上下文窗口的大小,比如窗口大小是 5,就是中心词前后各 5 个单词都是上下文词。如果中心词在句子的开头或者结尾,周围的单词不够,就取能取到的单词。比如句子是 [0,1,2,3,4,5,6],中心词是 0,窗口大小是 2,那上下文词就只有 1;中心词是 1,窗口大小是 2,上下文词就是 0、2、3。
五、负采样:找 “反派” 样本
我们之前学过用负采样来训练 word2vec,所以除了 “中心词 - 上下文词” 的正样本,我们还需要一些负样本,也就是 “中心词 - 噪声词” 对,噪声词就是不是上下文词的单词。
噪声词的采样是根据词的频率来的,频率越高的词,被选为噪声词的概率越大。比如 "the" 这个高频词,很容易被选为噪声词,这样可以让模型学会区分真正的上下文词和这些噪声词。
六、小批量加载:打包成训练用的小批量
为了训练的时候更高效,我们要把这些样本打包成小批量的格式。我们会把中心词、上下文词、负样本整理成一个数据集,这样训练的时候可以一次处理一批数据,不用每次只处理一个样本,大大提高训练效率。
七、整合代码:一键加载数据
我们把上面的步骤整合起来,写一个load_data_ptb函数,这个函数会帮我们下载数据集,处理成我们需要的格式,最后返回一个数据迭代器和词表。我们训练 word2vec 的时候,直接调用这个函数就可以加载数据了,非常方便。
八、小结
高频词在训练里用处不大,还会拖慢训练速度,我们可以用下采样的方法丢弃一些高频词,加快训练速度,让模型更关注有用的低频词。
我们把文本转换成 “中心词 - 上下文词” 的样本,再加上负采样的噪声词,打包成小批量的格式,这样训练的时候更高效。
我们可以用
load_data_ptb函数一键加载处理好的 PTB 数据集,方便后续训练词嵌入模型。
(注:文档部分内容可能由 AI 生成) 源地址