word2vec

word2vec

Word2vec is a group of related models that are used to produce so-called word embeddings.These models are shallow, two-layer neural networks, that are trained to reconstruct linguistic contexts of words: the network is shown a word, and must guess at which words occurred in adjacent positions in an input text. The order of the remaining words is not important (bag-of-words assumption).1

word2vec是产生词向量的模型,这个模型是浅层的、只有两层的神经网络。

After training, word2vec models can be used to map each word to a vector of typically several hundred elements, which represent that word’s relation to other words. This vector is the neural network’s hidden layer.2

通过训练,word2vec模型对每个词会训练出一个对应的向量,该向量一般是几百维,对应神经网络的隐藏层。
在LDA里,每个文档可以看成很多topics的一个混合(向量)(In LDA, each document may be viewed as a mixture of various topics.)。LDA挖掘的词-文档关系中的topic的含义是明确的,比如:军事等。而神经网络的隐藏层的“topic”则更具弹性,也不清楚具体的含义。同时维度个数也可以根据具体语料和业务逻辑动态调整.
word2vec的向量更像是“隐藏和弹性的topics”的一个mixture

实现方法

Word2vec relies on either skip-grams or continuous bag of words (CBOW) to create neural word embeddings. It was created by a team of researchers led by Tomas Mikolov at Google. The algorithm has been subsequently analysed and explained by other researchers.3

Skip grams are word windows from which one word is excluded, an n-gram with gaps. With skip-grams, given a window size of n words around a word w, word2vec predicts contextual words c; i.e. in the notation of probability p(c|w). Conversely, CBOW predicts the current word, given the context in the window, p(w|c).

实现代码

官方C(国内被封),地址是:
https://code.google.com/p/word2vec/
官方的地址
我已经从官方下载压缩后放到了csdn上了,地址:
http://download.youkuaiyun.com/detail/iterate7/9354479

Java
Python

其他:
gensim-github
word2vec-github

实际训练

上面说了很多基础,现在用真实的语料来训练并分析一下向量。
训练语料有:新闻数据、百科数据、以及Apps的数据(100w篇+)。
训练的参数:

./word2vec -train data/train.corpus  -output data/vectors.bin.corpus300-10-e3.skip 
-cbow 0 -negative 0 -hs 1 -threads 8 -binary 1 -size 300 -sample 1e-3 -window 5

实验对比

通过命令./distance modelfile来分析输入词的“相关词”,来体验一下:

[case A]    Word: 淘宝  Position in vocabulary: 9834

                                              Word       Cosine distance
------------------------------------------------------------------------
                                                卖家    0.828743
                                                网购    0.809675
                                                返利    0.809356
                                                淘宝购物    0.808547
                                                拍拍网  0.807375
                                                淘宝客  0.804461
                                                网上商城   0.800358
                                                购物网站   0.799866
                                                返现   0.797548
                                                淘宝商城   0.796996
                                                网店  0.793816
                                                易趣  0.792822
                                                返利网  0.787902
                                                天猫  0.786933
                                                京东商城   0.778246                               

[case B] Word: 淘宝  Position in vocabulary: 3182

                                              Word       Cosine distance
------------------------------------------------------------------------
                                                    天猫 0.740275
                                                    淘宝网 0.685521
                                                    购物平台 0.652280
                                                    速卖通 0.635772
                                                    双11 0.634207
                                                    双十一 0.628916
                                                    卖家 0.628741
                                                    一淘 0.624904
                                                    双12 0.608062
                                                    网店 0.603390
                                                    购物网站 0.600739
                                                    狂欢节 0.593849
                                                    全球购 0.570349
                                                    淘宝天猫 0.568009
                                                    天猫商城 0.560159
                                                    亚马逊中国 0.558590
                                                    拍拍网 0.550941
                                                    开店 0.548184
                                                    聚划算 0.541880
                                                    京东 0.540219



[case C] Word: 淘宝  Position in vocabulary: 1629

                                              Word       Cosine distance
------------------------------------------------------------------------
                                        天猫                0.839399
                                      天猫商城          0.806585
                                         淘宝网         0.804306
                                         聚划算         0.792901
                                            京东                0.770231
                                      淘宝商城          0.766468
                                            凡客                0.765869
                                            一淘                0.760800
                                      淘宝天猫          0.759214
                                            网购                0.744633
                                      淘宝购物          0.732014
                                      口袋购物          0.727638
                                           1号店                0.727363
                                      品牌特卖          0.712716
                                         美丽说         0.706966
                                         蘑菇街         0.703514
                                            折800               0.702829
                                         9.9包邮                0.702723
                                         逛淘宝         0.693607


上述的例子,输入的词是”淘宝“,在不同语料下训练后,找到的distance结果。如果候选语料是:新闻、app和百科,你能猜出那个向量对应那个语料吗?

case A->Baike
case B->News
case C->App
这个实验的目的是:在不同的语料下,会训练出不同的向量,代表的是不同领域下的信息,是否存在一个大而全的语料库而得到全面的向量信息?!
实验后的体验:存在一个大而全的语料库可以得到一个相对全面的向量信息,但是在维度固定的情况下,在垂直方面则肯定不如固定邻域下的训练结果,这也是非常显然的。所以最终需要的向量取决于具体的需求和用途。和”No Free Lunch“异曲同工,一个模型在这个方面优秀,在其他方面必然受损,一切都是公平的。

一些经验

  1. 语料未必越大越好,合理的大小和较高的质量是关键。

    较高的质量,应该是训练数据的所覆盖的领域分布合理,比如:新闻语料,不能只包括体育的信息,即使含有再海量的信息,如果领域单一,无法训练出更合理的向量,体育领域的特殊需求除外。

  2. 语料库的预处理非常关键,英文不涉及分词,而中文则涉及分词技术,其中分词算法和词库如果相比较的话,词库个人认为显得更为重要。对具体需求而言有很多技巧,比如:百科的词可以作为某种需求下的词库,没必要纠结“词”的概念。

  3. 另外一个处理,是不是去掉停词好一些?个人实验了几次后发现,没有太大的效果,而且对某些词而言,破坏了window=5的上下文信息,出现了更差的结果。这地方没有深入研究,有兴趣的可以做更多的实验。

  4. size=300,这是维度大小,太大并没有提高太多效果,但会导致训练时间很大。建议维度在[50-300]。

  5. window=5,太大貌似没提高太多,建议不超过20。

  6. 简单的模型(Skip-gram)在小语料下表现好,复杂的模型在大语料下略有优势。从实践中看,word2vec 的 CBOW 模型在 GB 级别的语料下已经足够好。 不过我大部分用的是Skip-gram,即使27GB的数据也是,不过用了几天时间才训练结束。

应用场景

最直观的一个应用就是计算词的相似度,以及基于词向量的其他计算。比如:搜索词相关推荐等。值得注意的是,不可能单纯依靠一个词向量来做很复杂的事情,必须结合其他的方法和信息来解决问题。
一个应用案例,针对“支付宝”这款app,利用word2vec向量,找到和支付宝相关的app。 最简单的方法,遍历所有的app,找到其对应向量,然后计算和“支付宝”向量的cos值,排序选取topn,得到如下结果:

    财付通     0.84852517
    支付      0.8357981
    网银      0.789168
    手机充值        0.7112752
    微信支付        0.69039243
    话费充值        0.6831741
    在线支付        0.67548144
    手机支付        0.6750946
    易付宝     0.6677191
    百度钱包        0.6629172
    手机话费充值      0.64792943
    手机钱包        0.6478036
    手机支付宝       0.6374088
    游戏充值        0.62997085
    信用卡     0.62130046

可以继续深化,提取app的下载次数和类别信息进行优化排序,也可以借助用户下载序列等信息,进行协同过滤深加工等,应该会得到更好的结果。

问题

能不能利用词的相加之和来计算句子之间的相似度?或者文本之间的相似度呢?stackoverflow上有这个话题的讨论,其给出的一个最直观的思路是:把文本的词袋对应的向量相加作为对应文本的向量。至于效果,大家可以自己去实验一下。

然而科学家们已经对此进行了研究,他们称文本的向量为:paragraph2vec或者doc2vec。参考:Distributed Representations of Sentences and Documents . Le, Quoc; et al. Retrieved 2015-08-14。

作为一名工程师,很多时候,就是希望能读一读这些大师的文章,很多时候是读不太懂的,读懂一些大概已经感到很满足了,如果再能在产品里加以应用并因此服务更多的人,也不失为善事一件。有时候想把理解的一些思路准备实现时,刚开始写public static void main,又有一批牛叉的人把这些思想实现后还开源,生活在这样的时代,有时候也是幸福。

我们应该做什么呢?个人觉得:
准确理解当前遇到的问题,在合适的时候,用合理的方法,用最小的成本来解决特定的问题。 至于复杂的数学模型,尽量理解吧。

参考文献

  1. Mikolov, Tomas; Sutskever, Ilya; Chen, Kai; Corrado, Greg S.; Dean, Jeff . Distributed representations of words and phrases and their compositionality[J] Advances in Neural Information Processing Systems.(2013).
  2. Mikolov, Tomas; et al. Efficient Estimation of Word Representations in Vector Space[J] Retrieved 2015-08-14.
  3. Goldberg, Yoav; Levy, Omar. word2vec Explained: Deriving Mikolov et al.’s Negative-Sampling Word-Embedding Method[J] Retrieved 2015-08-14.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值