将文字文本转换为词向量(word embedding)的过程中,一个非常著名的算法模型应该就是 Word2Vec 了。
相信大家或多或少都听说过,本节就来简单介绍一下 Word2Vec 。
什么是 Word2Vec ?
Word2Vec 可以非常有效的创建词嵌入向量,你可以把它理解为是一个算法模型,也可以理解为是一个工具包。
它 2013 年由 Google 推出,自问世以来,一直被广泛的应用在自然语言处理的词嵌入向量的表达过程中,它可以完成文本到词向量的映射,同时保留文本在向量空间的语义关系。
关于文本在向量空间的语义关系,可以参考10、词向量运算:queen=king-man+wowem的内容。
所以我们可以说, Word2Vec 是一个算法模型,人们利用这个模型对大量的文本数据进行训练,从而使模型可以输出训练好的词向量。
在使用 Word2Vec 模型训练时,其内部支持使用两种不同的训练算法进行训练:
-
- 连续词袋算法(Continuous Bag of Words, CBOW):该算法通过给定文本上下文单词,来预测中心词。
-
- 跳元算法(Skip-gram): 该算法通过给定文本中心词,来预测文本上下文词。
什么是上下文词和中心词呢?
假设有如下的句子:We are about to study the idea of deep learning.
如果已知 We are about to 和 the idea of deep learning,去预测 study,那么就相当于通过上下文去预测中心词,此时实用的也就是 CBOW 算法。
反过来,如果给定了单词 study,去预测句子中的其他上下文词(比如 idea),则是使用了 Skip-gram 算法。
这两种算法是 Word2Vec 中支持的两种算法,这里暂时不多介绍两种算法的细节。大家只需要知道,无论是连续词袋算法还是跳元算法,都是用来更好的预测文本中的词,以此来达到对大量单词进行语义学习的目的,从而产生更加有效的词向量。
Word2Vec 工具
Google 将 Word2Vec 进行了开源,并且提供了一套简洁可用的工具包。我们可以非常方便的使用这些工具来进行词向量相关的测试。
开源的源代码仓库 github 链接为:https://github.com/dav/ Word2Vec 。
该仓库为 C++ 源码仓库,使用前需要确保具备 C++ 源码的编译和运行环境。
如何编译?
代码下载之后,在 src 目录下,执行 ‘make’ 命令便可完成代码仓库的编译,编译生成的可执行文件会放在 bin 目录下。
在bin目录下,可以执行对应的可执行程序来测试词向量。
比如可以使用 distance程序来计算单词的相似程度。
例如,你可以执行下面的命令后,进入工具交互界面。
./distance ~/GoogleNews-vectors-negative300.bin
上述命令中的 GoogleNews-vectors-negative300.bin 是需要提前下载到本地中,是一个已经训练好的词嵌入模型(包含了词嵌入向量)文件,该文件的下载方式在10、词向量运算:queen=king-man+wowem有介绍。
需要先将其下载到本地电脑中,再进行使用。
执行完上述命令后,在交互界面输入“compute"单词。
distance 工具会输出该单词在词汇表中所处的位置,下图显示 compute 单词位于词汇表中的第 33688 的位置。
同时,distance 工具会给出与 compute 单词最接近的其他单词(使用余弦距离表示),比如 computation,calculate等。
你可以使用该工具测试其他单词。
该源码仓库完成编译后,还包含了很多其他的工具,详细的使用可以参考官方指南:https://code.google.com/archive/p/ Word2Vec /。
本节仅需要知道 Word2Vec 是Google开发的一个用来将文本转换为词向量的算法模型(工具)即可,并且该模型内置支持了两种不同的算法完成文本到词向量的转换,分别是 CBOW 和 Skip-gram 算法。
CBOW 和 Skip-gram 两种算法的细节非本专栏重点,这里就不深入介绍了,感兴趣的同学可以去百度一下。
总结一下
至此,我们把自然语言处理模型需要的预处理预备知识基本介绍完了。
这些知识包括: token 的概念,词汇表, token 转换到词向量的必要性以及一些代码演示。相信看到这里你应该对这些基础概念有了一定的了解。
事实上,以上的预备知识和操作,仅仅完成了一件事,那就是将人类可以理解的文本,转换到了高维空间的词向量。
只有将文本转换为词向量后,才可以输入给自然语言模型进行处理。
另外,对于基于 transformer 架构的模型而言,单有词向量是不够的,还需要使用位置编码来对文本信息进一步处理。这一点可以查看本节最上面的配图以了解这个过程。
只有将词向量和位置编码结合起来,才能作为真正的输入给到 transformer 架构(大模型)。
这一部分内容,为了逻辑连贯,并且更好理解,在后面介绍 transformer 技术细节时,再进行位置编码的相关介绍,主要会包括:transformer 的输入为什么需要位置编码,以及相关的算法和原理。