word2vec 是google 推出的做词嵌入(word embedding)的开源工具。 简单的说,它在给定的语料库上训练一个模型,然后会输出所有出现在语料库上的单词的向量表示,这个向量称为"word embedding"。基于这个向量表示,可以计算词与词之间的关系,例如相似性(同义词等),语义关联性(中国 - 北京 = 英国 - 伦敦)等。NLP中传统的词表示方法是 one-hot representation, 即把每个单词表示成dim维的稀疏向量,dim等于词汇量的大小。这个稀疏向量只有一个维度(该单词的index)上是1,其余全是0。这个表示方法使得单词之间是孤立的。 word embedding则是把单词的表示降维到n维的稠密向量,n<<dim。

作为非NLP专业的人,我不在此讲述word embedding的算法原理,本文是对word2vec工具使用过程的整理与总结,方便大家尽快上手。本文以中文处理为例,Word2vec对语言并没有限制。

安装 word2vec

从它的项目主页上下载源码(或者从我的github上下载 https://github.com/Leavingseason/word2vec  内容是一样的)。源码是linux下的c语言写的,如果要在windows下编译,需要用到Cygwin。Cygwin就是在windows平台上运行类Unix的模拟环境。安装需要几个小时,之后在Cygwin里面编译Word2vec,不需要改任何代码。

如果不想装Cygwin,也可以用Java版本的Word2vec。 我fork了一个java版本的实现:https://github.com/Leavingseason/Word2VEC_java  其中MyWord2VEC_java_eclipse.zip是我自己稍微整理的直接在eclipse上可以用的源码。经测试java版的也很好用。

准备语料库

要针对自己的情景,训练适合自己的词嵌入,所以要自己准备一个语料库。我用的是商品点评的语料。如果大家想做实验试试,可以用wiki的中文语料库,参考 http://www.52nlp.cn/%E4%B8%AD%E8%8B%B1%E6%96%87%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91%E8%AF%AD%E6%96%99%E4%B8%8A%E7%9A%84word2vec%E5%AE%9E%E9%AA%8C/comment-page-1  我自己处理了一份中文wiki语料库,已经完成格式化、繁体转简体和分词的过程,下载页面: http://pan.baidu.com/s/1jHZCvvo   格式如下图所示:

对于中文语料,第一步需要分词。现成的工具很多,我喜欢用SnowNLP https://github.com/isnowfy/snownlp , 除了分词,它还提供情感分析,繁体转简体,汉字to拼音等功能。 当然现有的其他NLP工具很多,像结巴分词等等。我试用了SnowNLP,感觉效果还挺不错的。

分完词后,把语料库整理成Word2vec的输入格式。这个格式很简单,单词之间用空格隔开就行了。 word2vec 把一个单词的前面和后面的k个单词作为context训练, 其中会自动把换行符替换成 </s> ,也就是句子分隔符。

训练word2vec模型

其实在源码目录有一些类似“demo-train-big-model-v1.sh”的脚本,它们就是运行Word2vec工具的示例。它会自动下载一个语料库然后执行。如果我们已经有了语料库,就不用下载了,脚本可以简化很多(Cygwin中运行):

time ./word2vec -train "data/review.txt" -output "data/review.model" -cbow  -size  -window  -negative  -hs  -sample 1e- -threads  -binary  -iter 
-train "data/review.txt" 表示在指定的语料库上训练模型
-cbow 1 表示用cbow模型,设成0表示用skip-gram模型 -size 100 词向量的维度为100 -window 8 训练窗口的大小为8 即考虑一个单词的前八个和后八个单词
-negative 25 -hs 0  是使用negative sample还是HS算法
-sample 1e-4 采用阈值
-threads 20 线程数
-binary 1 输出model保存成2进制 
-iter 15 迭代次数

训练还是很快的,在我的1G语料库上训练2小时左右。

使用结果

得到模型后,可以用命令  ./distance data/review.model 测试单词的最近邻。 这个要求刚才生成的模型是保存成二进制的。

除了计算距离,还有一些有意思的例子,例如http://www.tuicool.com/articles/RB7fqaB 所写。

如果把模型保存成普通文本型,那么可以得到每个单词的向量表示,使用就灵活了,可以在自己的程序里读取这个model, 然后和自由计算各种值。

如果想偷懒的话,就用上述提到的java版程序加载model,然后可以做一系列方法调用。

Word2Vec 使用总结的更多相关文章

  1. word2vec 中的数学原理详解

    word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Miko ...

  2. Java豆瓣电影爬虫——使用Word2Vec分析电影短评数据

    在上篇实现了电影详情和短评数据的抓取.到目前为止,已经抓了2000多部电影电视以及20000多的短评数据. 数据本身没有规律和价值,需要通过分析提炼成知识才有意义.抱着试试玩的想法,准备做一个有关情感 ...

  3. word2vec参数调整 及lda调参

     一.word2vec调参   ./word2vec -train resultbig.txt -output vectors.bin -cbow 0 -size 200 -window 5 -neg ...

  4. [Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型

    深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢? ...

  5. Word2vec多线程(tensorflow)

    workers = [] for _ in xrange(opts.concurrent_steps): t = threading.Thread(target=self._train_thread_ ...

  6. Word2vec 模型载入(tensorflow)

    opts = Options() with tf.Graph().as_default(), tf.Session() as session: model = Word2Vec(opts, sessi ...

  7. Forward-backward梯度求导(tensorflow word2vec实例)

    考虑不可分的例子         通过使用basis functions 使得不可分的线性模型变成可分的非线性模型 最常用的就是写出一个目标函数 并且使用梯度下降法 来计算     梯度的下降法的梯度 ...

  8. Tensorflow word2vec编译运行

    Word2vec 更完整版本(非demo)的代码在 tensorflow/models/embedding/     首先需要安装bazel 来进行编译 bazel可以下载最新的binary安装文件, ...

  9. 中英文维基百科语料上的Word2Vec实验

    最近试了一下Word2Vec, GloVe 以及对应的python版本 gensim word2vec 和 python-glove,就有心在一个更大规模的语料上测试一下,自然而然维基百科的语料进入了 ...

随机推荐

  1. SqlServer灾备方案(本地)

    如果你曾经有那么一个不经意的心跳来自于数据库数据损坏:错误的新增.更新.删除 .那么下面的方案一定能抚平你的创伤! 对于一个数据库小白来说,数据库的任何闪失带来的打击可说都是致命的.最初,我们让一个叫 ...

  2. javascript 实现一个回文数字

    写一个方法,让"1234"变成回文数字“1234321”,就是顺着读和倒着读都是一样的:注:不让用reverse()方法: function palindrome(str){ va ...

  3. 12种不适宜使用的javascript语法

    1. == (o゜▽゜)o☆[BINGO!] Javascript有两组相等运算符,一组是==和!=,另一组是===和!==.前者只比较值的相等,后者除了值以外,还比较类型是否相同. 请尽量不要使用前 ...

  4. windows下React-native 环境搭建

    公司决定试水react-native,mac审批还没下来,没办法,先用windows硬着头皮上吧. 参考文章: React Native 中文网官方文档 史上最全Windows版本搭建安装React ...

  5. Objective-C 快速入门--基础(五)

    1.什么是属性?属性会帮我们做哪些事情?请详细说明. (1)①属性是Objective-C 2.0定义的语法,为实例变量提供了setter.getter方法的默认实现:②能在一定程度上简化程序代码,并 ...

  6. Linux 磁盘自检介绍

    在Linux系统中,有时候重启会耗费非常长的时间,如果你进一步检查细节,就会发现绝大部分时间都耗费在磁盘自检(fsck)上了,有时候遇到时间比较紧急的情况,磁盘自检耗费的时间非常长,真的是让人心焦火急 ...

  7. 执行shell脚本,报错坏的解释器

    在windows下面用editplus编写了一个shell脚本.执行时报错 "/bin/bash^M: 坏的解释器: 没有那个文件或目录 解决方法: 在终端输入sed -i 's/\r$// ...

  8. Tornado框架简析

    Tornado是一款轻量级的Web服务器,同时又是一个开发框架.采用单线程非阻塞I/O模型(epoll),主要是为了应对高并发 访问量而被开发出来,尤其适用于comet应用. Tornado服务器3大 ...

  9. IntelliJ IDEA 教程设置讲解

    IntelliJ IDEA 常用设置讲解 说明 IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.Ant.JUnit.CVS整合.代码审查 ...

  10. PHP实现堆排序

    经验 工作了,面试我工作这家公司时被技术面打击得不行,因为自己的数据结构等基础学得实在太差,虽然原来是想做设计师的说...不过看在PHP写得还凑合的份上能来实习了,但还是决心恶补一下基础. 其实自己之 ...