本文主要介绍Google官网提供的word2vec工具:word2vec,计算词的连续分布表示的工具。

本文并不涉及word2vec算法的原理与细节,只是简单的介绍了word2vec这个工具及一些在实践中的表现等。

word2vec工具提供了CBOW模型和skip-gram模型计算词的向量表示的有效实现。这些表示能够随后应用在后期的NLP应用和进一步研究中。

 

博客中绿色加粗字体表示C编译之后的可执行文件,加粗倾斜字体表示脚本文件,加粗倾斜下划线字体表示数据文件。

1. Quick start

  • Download the code: svn checkout http://word2vec.googlecode.com/svn/trunk/ (应该已经打不开了,翻墙可以)
  • Run 'make' to compile word2vec tool
  • Run the demo scripts: ./demo-word.sh and ./demo-phrases.sh

2. How does it work

word2vec工具使用一个文本语料库作为输入并将生成的词向量作为输出。word2vec首先从训练的文本数据中构造出一个词汇表然后学习词的向量表示。输出的词向量文件可以作为许多NLP应用和ML应用的特征。

研究学到的向量表示的简单方法是找出用户给定的词的最接近的词。distance工具能够实现这个需求(命令:./distance vectors.bin)。例如,当输入“france”时,distance能够输出与“france”最相似的词和这些词与“france”的距离:

demo-word.sh

  • 下载并解压缩text8.gz文件
  • 使用text8.gz作为输入数据集训练word2vec,训练输出文件是vectors.bin
  • ./distance vectors.bin找出与输入词语最接近的一组词(输入:france)

word2vec包括两个主要的学习算法:continuous bag-of-words和continuous skip-gram。参数“-cbow”允许用户选择这两种算法中的任何一个。这两种算法都能够学到词的表示,这个表示对于语句序列的其他词来说是非常有用的。

3. Interesting properties of the word vectors

词向量能够捕获许多语言规律。例如,向量操作vector('Paris')-vector('France')+vector('Italy') 能够生成一个与vector('Rome')非常接近的向量,向量操作vector('king')-vector('man')+vector('woman')vector('queen')非常接近。运行demo-analogy.sh能够做一个小的实验。

demo-analogy.sh

  • 下载并解压缩text8.gz文件
  • 使用text8.gz作为输入数据集(在更大的数据集上train模型会有更好的效果)训练word2vec,训练输出文件是vectors.bin
  • ./word-analogy vectors.bin找出与输入的三个词最接近的一组词并输出这三个词在词汇表中的位置(输入:paris france berlin)

为了观察词向量空间的强规律性,在高维度的大数据集上面训练模型就显得很有必要。word2vec工具能够在大的数据集(千亿级个词)上完成模型训练。

4. From words to phrases and beyond

在某些应用中,大文本块的向量表示是很有用途的。例如,'san francisco'有一个唯一的向量表示是非常可取的。这可以通过使用word2phrase工具来预处理训练数据集进而生成词组完成,示例脚本./demo-phrases.sh实现了这一过程。与'san_francisco' 最接近表示的样例输出是:

demo-phrases.sh

  • 下载并解压缩news.2012.en.shuffled.gz文件
  • 文本处理
  • 使用news.2012.en.shuffled-norm0作为输入训练word2phrase,输出是news.2012.en.shuffled-norm0-phrase0
  • 使用news.2012.en.shuffled-norm0-phrase0作为输入训练word2phrase,输出是news.2012.en.shuffled-norm0-phrase1 
  • 文本处理
  • 使用news.2012.en.shuffled-norm1-phrase1作为输入数据集训练word2vec,训练输出文件是vectors-phrase.bin 
  • ./distance vectors-phrase.bin找出与输入词最接近的一组词组

5. How to measure quality of the word vectors

影响词向量效果的几个因素分别是:训练数据的数量和质量,向量的维度,训练算法。

词向量的效果对于一些应用来说是非常重要的。然而,复杂实验的不同超参数试探可能非常耗时。因此,我们设计了简单的测试集用于快速评估词向量的效果。

对于词的相关性测试集,运行./demo-word-accuracy.sh;对于词组的相关性测试集,运行./demo-phrase-accuracy.sh。注意,精度与训练数据集的大小非常相关,我们针对这两个测试集的最好实验结果是:超过70%的精度和接近100%的覆盖率。

demo-word-accuracy.sh

  • 下载并解压缩text8.gz文件
  • 使用text8.gz作为输入数据集训练word2vec,训练输出文件是vectors.bin
  • ./compute-accuracy vectors.bin 30000 < questions-words.txt

demo-phrase-accuracy.sh

  • 下载并解压缩news.2012.en.shuffled.gz文件
  • 文本处理
  • 使用news.2012.en.shuffled-norm0作为输入训练word2phrase,输出是news.2012.en.shuffled-norm0-phrase0
  • 使用news.2012.en.shuffled-norm0-phrase0作为输入训练word2phrase,输出是news.2012.en.shuffled-norm0-phrase1
  • 文本处理
  • 使用news.2012.en.shuffled-norm1-phrase1作为输入数据集训练word2vec,训练输出文件是vectors-phrase.bin 
  • ./compute-accuracy vectors-phrase.bin < questions-phrases.txt

6. Word clustering

词向量也能够用于从大数据集中生成词的类别。这可以通过在top词向量中执行K-means聚类实现。./demo-classes.sh证明了这一过程,其输出是词和词的相关类别IDs的词汇表文件。

demo-classes.sh

  • 下载并解压缩text8.gz文件
  • 使用text8.gz作为输入数据集训练word2vec,训练输出文件是classes.txt
  • classes.txt的第二列按照数字顺序升序排序输出到classes.sorted.txt

7. Performance

在多核-CPU机器 (参数'-threads N'进行配置)上并行训练能够显著提高训练速度。参数选择对于速度和精度来说都是至关重要的,对于不同的应用,主要的参数设置如下:

8. Where to obtain the training data

训练数据越大词向量效果显著提高。为了便于研究,可以考虑使用可在线应用的数据集:

9. Pre-trained word and phrase vectors

Nothing to say.

10. Pre-trained entity vectors with Freebase naming

Nothing to say.

11. Final words

Nothing to say.

(12)References

12. Other useful links

Word2vec in Python by Radim Rehurek in gensim (plus tutorial and demo that uses the above model trained on Google News)。

Word2vec in Java as part of the deeplearning4j project. Another Java version from Medallia here

Word2vec implementation in Spark MLlib

 

13. Disclaimer

Nothing to say.

更多推荐