Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5640268
  • 博文数量: 291
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7924
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-06 14:28
个人简介

阿里巴巴是个快乐的青年

文章分类

全部博文(291)

文章存档

2018年(21)

2017年(4)

2016年(5)

2015年(17)

2014年(68)

2013年(174)

2012年(2)

分类: 架构设计与优化

2015-01-26 21:07:22

一、简要介绍
        word2vec是Google在2013年发布的一个开源项目,它能够将词表征为实数值向量的高效工具,采用的模型有CBOW(Continuous Bag-Of-Words,即连续的词袋模型)和Skip-Gram两种。word2vec项目详细信息请参见。
        word2vec通过训练,可以把文本内容的处理简化为K维向量空间中的向量运算,而向量空间上的相似度可以用来表示文本语义上的相似度,因此,word2vec输出的词向量可以用来做聚类、找同义词、词性分析等NLP相关工作。word2vec单机每天可训练上千亿词,可见性能之高效。
        与传统信息检索模型中的向量空间模型(VSM)不同,向量空间模型(VSM)是将文档向量化,而word2vec是将向量化。更新多心请参见。

二、快速入门
1、代码下载
        #mkdir word2vec && cd word2vec
        #svn co
2、编译源码
        修改makefile,以linux为例,将编译选项-Ofast改为-O2或者-g(调试时用),删除编译器不认识的选项-march=native和-Wno-unused-result。编译word2vec工具:
        #make
        编译通过后,产生word2vec和distance。
3、训练分词
        训练前确认保语料已经分词过了,执行如下命令,训练模型:
        ./word2vec -train text8 -output vectors.bin -cbow 0 -size 200 -window 10 -negative 0 -hs 1 -sample 1e-3 -threads 8 -binary 1
        上面参数说明如下:
        -train:输入文件
        -output:输出的词向量(或聚类)
        -cbow 0:0表示使用skip-gram模型(慢,对罕见词有利),1表示使用continuous bag-of-words模型(速度快)。
        -size 200:每个单词的向量维度是200
        -window 10:窗口大小,skip-gram通常在10附近,cbow通常在5附近。
        -negative 0:采样使用hierarchical softmax方法(负采样,对常见词有利),不使用negative sampling方法(对罕见词有利)。
        -sample 1e-3:采样阈值,如果一个词语在训练样本中出现的频率越大,那么就越会被采样。
        -binary 1:1表示模型存储为二进制,0表示模型存储为文本。
        还有其他一些默认参数:
        -alpha:学习速率,默认为0.025
        -min-count:最低频率,默认是5,如果一个词语在文档中出现的次数小于5,那么就会丢弃。
        -classes 5:输出单词聚类(聚类个数为5),此时将不再输出词向量。
4、词的相似关系提取
        执行下面命令,提取词的相似关系:
        ./distance vectors.bin
        比如:输入china,就能得到相似词。
        上面过程也可以直接执行脚本demo-word.sh、demo-analogy.sh、demo-phrases.sh等完成编译、训练和相似词查询,默认下载样本数据text8,text8中是以空格分隔的英文单词,共1600多万个单词。
        如果你的分词是中文语料,且每个词(term)之间用空格分隔,则也可以直接用word2vec来处理。
5、聚类
        word2vec内置聚类(k-means)功能,即用词的向量表示来判断词与词的距离。
        ./word2vec -train text8 -output classes.txt -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -classes 100
        其中,classes表示聚成100个类,这个值可以根据你的语料多少或者分类要求而定。
        输出的数据classes.txt分为2列,分别是词和所属于的聚簇:
        #sort -k2,2n classes.txt |vim -
        zambia 99
        zambian 99
        zanzibar 99
        ...
        从上面数据可以看出对于部分近似词的聚类效果还是可以的。


阅读(4566) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~