您的位置:首页 > 其它

word2vec使用有感

2016-08-26 11:31 447 查看
      近期考虑使用Google研发的一款基于Deep Learning的开源的学习工具——word2vec,这是首款面向大众的Deep Learning学习工具。word2vec(word to vector)是一个将单词转换成向量形式的工具。通过转换,把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度。

      word2vec为计算向量词提供了一种有效的连续词袋CBOW(bag-of-words)和skip-gram架构实现,word2vec遵循Apache License 2.0开源协议。word2vec的官方地址:https://code.google.com/p/word2vec/

      word2vec的学习任务:(引用来源:http://ir.dlut.edu.cn/news/detail/291)

   假设有这样一句话:今天 下午 2点钟 搜索 引擎 组 开 组会。

      任务1:对于每一个word, 使用该word周围的word来预测当前word生成的概率。如使用“今天、下午、搜索、引擎、组”来生成“2点钟”。

      任务2:对于每一个word,使用该word本身来预测生成其他word的概率。如使用“2点钟”来生成“今天、下午、搜索、引擎、组”中的每个word。

   两个任务共同的限制条件是:对于相同的输入,输出每个word的概率之和为1。Word2vec的模型就是想通过机器学习的方法来达到提高上述任务准确率的一种方法。两个任务分别对应两个的模型(CBOW和skim-gram)。



     使用神经网络来训练:
                  


     除了google自己的word2vec工具,各位对词向量感兴趣的牛人们也相继编写了各自不同的版本。其中比较好用的是Python Gensim主题模型包中的word2vec,但通过阅读其源码python版本只实现了skip-gram模型,并且只实现了通过分层softmax方法对其训练,并没有使用negative
sampling。下面列举一下目前出现的版本以及相对应的地址,供大家选择。如下表:(引用来源:http://blog.csdn.net/zhoubl668/article/details/24314769

版本

地址

CBOW

Skip-Gram

C

http://word2vec.googlecode.com/svn/trunk/

HS

NEG

HS

NEG

python

http://radimrehurek.com/gensim/

 

 

HS

 

Java

https://github.com/ansjsun/Word2VEC_java

HS

 

HS

 

C++

https://github.com/jdeng/word2vec

未知

未知

未知

未知

   
   具体的使用过程如下:
    1.下载google word2vec项目源码,具体地址是http://word2vec.googlecode.com/svn/trunk/
    2.使用ssh登录Linux服务器或虚拟机,使用WinSCP软件连接服务器,将源码文件传至Linux系统中。
    3.进入word2vec目录,ls命令查看文件夹内容,只有trunk文件夹,进入,命令行输入make指令,进行编译。
    4.将文本语料进行分词,以空格,tab隔开都可以,中文分词工具可以使用张华平博士的NLPIR2016,下载地址:http://ictclas.nlpir.org/downloads 可参考上一篇文章《NLPIR/ICTCLAS 2015 分词系统使用
    5.将分好词的语料进行训练,假定语料文件名称为data.txt且在trunk目录下。输入命令:

        ./word2vec -train data.txt -output vectors.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1 
      注:-train
test.txt:输入文件是data.txt,

          -output vectors.
4000
bin输出文件是vectors.bin;

          -cbow 0:不使用cbow模型,默认为0:Skip-Gram模型,1:CBOW模型。

          -size 200:每个单词的向量维度是200,

          -window 5:训练的窗口大小为5,就是考虑一个词前五个和后五个词语(实际代码中还有一个随机选窗口的过程,窗口大小<=5):

          -negative 0: 表示是否使用NEG方,0表示不使用,其他的值目前不清楚

          -hs
1:不使用NEG方法,使用HS方法。
          -sample
1e-3:指的是采样的阈值,如果一个词语在训练样本中出现的频率越大,那么就越会被采样。

          -threads 12:表示进程个数

          -binary 1:为1指的是结果二进制存储,为0是普通存储(普通存储的时候是可以打开看到词语和对应的向量的)

      除了以上命令中的参数,word2vec还有几个参数对我们比较有用比如:

          -alpha:设置学习速率,默认的为0.025.

          -min-count:设置最低频率,默认是5,如果一个词语在文档中出现的次数小于5,那么就会丢弃。

          -classes:设置聚类个数,获取每个词对应的向量之后,对词语进行k-means聚类
    6.训练好模型之后,得到vectors.bin这个模型文件,即文档中词语和其对应的向量。下面我们可以利用这个模型做自然语言处理的任务。
      Google代码里面提供了distance的一个应用,说白了就是读取模型文件中每一个词和其对应的向量,计算所输入query的词,与其他所有词语的cosine相似度,排序,返回结果。对于训练出来的模型进行操作,推荐大家使用http://blog.csdn.net/zhaoxinfan/article/details/11640573 ,这个java版本的模型读取类,比较方便,读取模型之后大家就可以来实现各种各样有趣的东西了。
     7.聚类命令如下:参数参考5中列举的参数

         ./word2vec -train resultbig.txt -output classes.txt -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -classes 500
         按类别排序命令:sort classes.txt -k 2 -n > classes.sorted.txt  




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  word