word2vector使用

Google的Word2Vector官网:https://code.google.com/p/word2vec/

下载下来的Demo源码文件共有如下几个:
word2vec – Revision 41: /trunk

LICENSE //Apache LICENSE
README.txt //工具使用说明
compute-accuracy.c
demo-analogy.sh  //
demo-classes.sh  //词聚类的示例脚本
demo-phrase-accuracy.sh
demo-phrases.sh  //
demo-train-big-model-v1.sh
demo-word-accuracy.sh
demo-word.sh
distance.c
makefile
questions-phrases.txt
questions-words.txt
word-analogy.c
word2phrase.c
word2vec.c

【快速入门】:1. 从http://word2vec.googlecode.com/svn/trunk/ 下载所有相关代码(所有的文件如上);
2. 运行make编译word2vec工具:Makefile的编译代码在makefile.txt文件中,先改名makefile.txt 为Makefile,然后在当前目录下执行make进行编译,生成可执行文件(编译过程中报出很出Warning,暂且不管);
3. 运行示例脚本:./demo-word.sh 和 ./demo-phrases.sh:看一下./demo-word.sh的内容,大致执行了3步操作
a). 从http://mattmahoney.net/dc/text8.zip 下载了一个文件text8 ( 一个解压后不到100M的txt文件,可自己下载并解压放到同级目录下),
b). 执行word2vec生成词向量到 vectors.bin文件中,(速度比较快,几分钟的事情)
[root@localhost /home/jacoxu/word2vec]$./demo-word.sh
make: Nothing to be done for `all’.
Starting training using file text8
Vocab size: 71291
Words in train file: 16718843
Alpha: 0.000560 Progress: 98.88% Words/thread/sec: -117.11k
c). 执行./distance vectors.bin可以进入一个计算word相似度的demo中去,如下:
Enter word or sentence (EXIT to break): china

Word: china Position in vocabulary: 486

Word Cosine distance (找到了很多和china共现度很高的词汇,可以得到认可)
————————————————————————
taiwan 0.656181
japan 0.633499
tibet 0.607813
manchuria 0.581230
hainan 0.561931
xiamen 0.555860
chongqing 0.550099
jiang 0.549195
chinese 0.548320
liao 0.548220

Enter word or sentence (EXIT to break): hongkong

Word: hongkong Position in vocabulary: 24623

Word Cosine distance(感觉效果很糟糕,有些不知所云,认可度很低,主要还是因为语料太少,覆盖面窄)
————————————————————————
jardines 0.708792
matheson 0.659444
jardine 0.611295
shareholding 0.489012
company 0.431918
kowloon 0.417640
firm 0.415780
venture 0.415077
plc 0.409350
shanghai 0.404716

然后看一下./demo-phrases.sh的内容,也大致执行了3步操作:
a). 从http://www.statmt.org/wmt14/training-monolingual-news-crawl/news.2012.en.shuffled.gz 下载了一个文件news.2012.en.shuffled.gz ( 一个解压到1.7G的txt文件,可自己下载并解压放到同级目录下);
b). 将文件中的内容拆分成 phrases,然后执行./word2vec生成短语向量到 vectors-phrase.bin文件中(数据量大,速度慢,将近半个小时),如下:
[root@localhost /home/jacoxu/word2vec]$ bash demo-phrases.sh (总耗时75分钟)
make: Nothing to be done for `all’.
Starting training using file news.2012.en.shuffled-norm0
Words processed: 296900K Vocab size: 33198K
Vocab size (unigrams + bigrams): 18838711
Words in train file: 296901342
Words written: 296900K
real 11m1.465s
user 10m47.888s
sys 0m8.317s
Starting training using file news.2012.en.shuffled-norm0-phrase0
Words processed: 280500K Vocab size: 38761K
Vocab size (unigrams + bigrams): 21728781
Words in train file: 280513979
Words written: 280500K
real 10m43.277s
user 10m29.983s
sys 0m8.137s
Starting training using file news.2012.en.shuffled-norm1-phrase1
Vocab size: 681320
Words in train file: 283545447
Alpha: 0.000005 Progress: 100.00% Words/thread/sec: 83.67k
real 49m3.925s
user 847m21.369s
sys 1m11.140s

c). 执行./distance vectors-phrase.bin 可以进入一个计算word相似度的demo中去,如下:
Enter word or sentence (EXIT to break): great_wall

Word: great_wall Position in vocabulary: 36052

Word Cosine distance (确实找到一些极为相关的词汇)
————————————————————————
mutianyu 0.588232
terra_cotta_warriors 0.541900
forbidden_city 0.527797
changsha 0.520975
based_koryo_tours 0.510810
three_gorges 0.509765
world’s_tallest 0.501899
dajie 0.500128
ming_dynasty 0.496112
qin_shihuang 0.486954

Enter word or sentence (EXIT to break): hong_kong

Word: hong_kong Position in vocabulary: 2322

Word Cosine distance (并没有任何体现Hong Kong本土的词汇,仍是语料的问题)
————————————————————————
singapore 0.755051
mainland_china 0.739481
shanghai 0.732764
hong_kong’s 0.727834
mainland_chinese 0.652696
singapore’s 0.636082
keith_bradsher_contributed_reporting 0.626221
hang_seng_index_fell 0.621854
chinese 0.617985
taipei 0.609921

【其他】:Java版本Word2Vector

词向量的训练最经典的有 3 个工作,C&W 2008、M&H 2008、Mikolov 2010,看看其他几个版本的Word Embedding:
(以下大部分内容摘自Zhao老板的学生licstar)
1. 【C&W 的 SENNA – 2008】
■ 训练语料及规模:English Wikipedia + Reuters RCV1 共 631M + 221M 词;
■ 词向量:130000 词,50 维;
■ 特点:不区分大小写,经过有监督修正,训练了7周;
■ 资源:测试代码、词向量 [链接]

Ronan Collobert 和 Jason Weston 在 2008 年的 ICML 上发表的《A Unified Architecture for Natural Language Processing: Deep Neural Networks with Multitask Learning》里面首次介绍了他们提出的词向量的计算方法,他们还把论文所写的系统开源了,叫做 SENNA,3500 多行纯 C 代码也是写得非常清晰。C&W 这篇论文主要目的并不是在于生成一份好的词向量,甚至不想训练语言模型,而是要用这份词向量去完成 NLP 里面的各种任务,比如词性标注、命名实体识别、短语识别、语义角色标注等等。

2. 【M&H 的 HLBL – 2007】
Andriy Mnih 和 Geoffrey Hinton 在 2007 年和 2008 年各发表了一篇关于训练语言模型和词向量的文章。2007 年发表在 ICML 上的《Three new graphical models for statistical language modelling》表明了 Hinton 将 Deep Learning 战场扩展到 NLP 领域的决心。2008 年发表在 NIPS 上的《A scalable hierarchical distributed language model》则提出了一种层级的思想替换了 Bengio 2003 方法中最后隐藏层到输出层最花时间的矩阵乘法,在保证效果的基础上,同时也提升了速度。2008 年 NIPS 的这篇论文,介绍的是“hierarchical log-bilinear”模型,很多论文中都把它称作简称“HLBL”。

3. 【Mikolov 的 RNNLM – 2010】
■ 训练语料及规模:Broadcast news;
■ 词向量:82390 词,80、640、1600 维;
■ 特点:不区分大小写;训练了若干天;
■ 资源:训练、测试代码、词向量 [链接]

Bengio 2003 在论文里提到一句,可以使用一些方法降低参数个数,比如用循环神经网络。Mikolov 就抓住了这个坑,从此与循环神经网络结下了不解之缘。他最早用循环神经网络做语言模型是在 INTERSPEECH 2010 上发表的《Recurrent neural network based language model》里。Recurrent neural network 是循环神经网络,简称 RNN,还有个 Recursive neural networks 是递归神经网络(Richard Socher 借此发了一大堆论文),也简称 RNN。看到的时候需要注意区分一下。不过到目前为止,RNNLM 只表示循环神经网络做的语言模型,还没有歧义。
在之后的几年中,Mikolov 在一直在RNNLM 上做各种改进,有速度上的,也有准确率上的。现在想了解 RNNLM,看他的博士论文《Statistical Language Models based on Neural Networks》肯定是最好的选择。

4. 【Huang 的语义强化 – 2012】
■ 训练语料及规模:English Wikipedia;
■ 词向量:100232 词,50 维;
■ 特点:不区分大小写,最高频的6000词,每词有10种表示;
■ 资源:训练、测试代码、词向量 [链接]

与前几位大牛的工作不同,Eric H. Huang 的工作是在 C&W 的基础上改进而成的,并非自成一派从头做起。他这篇发表在 ACL 2012 上的《Improving Word Representations via Global Context and Multiple Word Prototypes》试图通过对模型的改进,使得词向量富含更丰富的语义信息。他在文中提出了两个主要创新来完成这一目标:(其实从论文标题就能看出来)第一个创新是使用全文信息辅助已有的局部信息,第二个创新是使用多个词向量来表示多义词。
Huang 认为 C&W 的工作只利用了“局部上下文(Local Context)”。C&W 在训练词向量的时候,只使用了上下文各 5 个词,算上自己总共有 11 个词的信息,这些局部的信息还不能充分挖掘出中间词的语义信息。Huang 直接使用 C&W 的网络结构计算出一个得分,作为“局部得分”。
然后 Huang 提出了一个“全局信息”,这有点类似传统的词袋子模型。词袋子模型是把文章中所有词的 One-hot Representation 加起来,形成一个向量(就像把词全都扔进一个袋子里),用来表示文章。Huang 的全局模型是将文章中所有词的词向量求个加权平均(权重是词的 idf),作为文章的语义。他把文章的语义向量和当前词的词向量拼接起来,形成一个两倍长度的向量作为输入,之后还是用 C&W 的网络结构算出一个打分。
有了 C&W 方法的得到的“局部得分”,再加上在 C&W 方法基础上改造得到的“全局得分”,Huang 直接把两个得分相加,作为最终得分。最终得分使用 C&W 提出的 pair-wise 目标函数来优化。
加了这个全局信息有什么用处呢?Huang 在实验中发现,他的模型能更好地捕捉词的语义信息。比如 C&W 的模型中,与 markets 最相近的词为 firms、industries;而 Huang 的模型得到的结果是 market、firms。很明显,C&W 的方法由于只考虑了临近词的信息,最后的结果是词法特征最相近的词排在了前面(都是复数形式)。不过我觉得这个可能是英语才有的现象,中文没有词形变化,如果在中文中做同样的实验还不知道会有什么效果。
Huang 论文的第二个贡献是将多义词用多个词向量来表示。Bengio 2003 在最后提过这是一个重要的问题,不过当时他还在想办法解决,现在 Huang 给出了一种思路。
将每个词的上下文各 5 个词拿出来,对这 10 个词的词向量做加权平均(同样使用 idf 作为权重)。对所有得到的上下文向量做 k-means 聚类,根据聚类结果给每个词打上标签(不同类中的同一个词,当作不同的词处理),最后重新训练词向量。
当然这个实验的效果也是很不错的,最后 star 的某一个表示最接近的词是 movie、film;另一个表示最接近的词是 galaxy、planet。

5. 【Turian 对比试验 – 2010】
优化C&W代码并重跑试验
■ 训练语料及规模:Reuters RCV1 63M 词;
■ 词向量:268810 词 25、50、100、200 维;
■ 特点:区分大小写,训练了若干周;
■ 资源:训练代码、词向量 [链接]

由M帮忙重跑M&H
■ 训练语料及规模:Reuters RCV1;
■ 词向量:246122 词 50、100 维;
■ 特点:区分大小写,用GPU训练了7天;
■ 资源:训练代码、词向量 [链接]

问题?主页上提供了 两份 词向量,一份是 scaled,一份是unscaled,scaled的作用是什么?这个Scale貌似是全局的,而非单个向量的。
README.text中是这么解释的:
embeddings-scaled.*.txt.gz
Embeddings scaled by 0.1/stddev(embeddings), as described in the ACL 2010 paper.
These are the embeddings you should use by default, if you just want word features.
The first column is the word, the rest of the columns are the dimensions of the embedding.
也就是说通过stddev进行了一个全局的样本标准偏差进行缩放;

Turian 的工作前面只是提了一下,他在做 C&W 向量与 H&M 向量的对比实验时,自己按照论文重新实现了一遍他们的方法,并公布了词向量。后来 C&W 在主页上强调了一下:尽管很多论文把 Turian 实现的结果叫做 C&W 向量,但是与我发布的词向量是不同的,我这个在更大的语料上训练,还花了两个月时间呢!
Turian 公布的 M&H 向量是直接请 Andriy Mnih 在 Turian 做好的语料上运行了一下 HLBL,所以没有代码公布。同时 Turian 自己实现了一份 LBL模型,但是没有公布训练出来的词向量。(这是根据他主页上描述推测的结果,从 Turian 的论文中看,他应该是实现了 HLBL 算法并且算出词向量的。)
RCV1 的词数两篇文章中所写的数据差距较大,还不知道是什么原因。

Turian 发表在 ACL 2010 上的实验对比了 C&W 向量与 M&H 向量用作辅助特征时的效果。在短语识别和命名实体识别两个任务中,C&W 向量的效果都有略微的优势。同时他也发现,如果将这两种向量融合起来,会有更好的效果。除了这两种词向量,Turian 还使用 Brown Cluster 作为辅助特征做了对比,效果最好的其实是 Brown Cluster,不过这个已经超出本文的范围了。

【值得一读】:
1. What are the continuous bag of words and skip-gram architectures
2. Hierarchical Softmax & Negative Sampling
3. word2vec 中的数学原理详解
4. Deep Learning in NLP (一)词向量和语言模型:http://licstar.net/archives/328

原文地址:http://ju.outofmemory.cn/entry/93431


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Word2Vec是一种用于将文本转换为向量表示的工具,它是通过训练一个神经网络模型来实现的。在Word2Vec的源码中,有几个主要的部分和过程。 首先,源码中包含了数据预处理的步骤。这个步骤包括将原始文本分割成单词,建立词汇表并为每个单词分配一个唯一的标识符。源码还负责将原始文本转换为训练样本,其中每个样本由一个输入单词和一个输出单词组成。 接下来,源码中定义了训练模型的结构和参数。该模型通常是一个两层的神经网络,其中包含一个隐藏层和一个输出层。隐藏层的节点数可以根据需求进行设置。训练模型中的参数包括学习率、迭代次数和训练样本的窗口大小等。 然后,源码中实现了模型的训练过程。训练过程基于输入和输出单词的样本对,通过对模型进行多次迭代来优化模型的参数。在每一次迭代的过程中,模型会根据当前输入单词预测输出单词,并计算预测结果与实际输出之间的误差。然后,模型会使用误差来更新参数,以提高模型的准确性。 最后,源码中还提供了用于将训练好的模型应用于新的文本数据的方法。通过载入训练好的模型参数,并使用这些参数来将新的文本转换为向量表示。 总的来说,Word2Vec的源码实现了一个能够将文本转为向量表示的工具,并通过训练神经网络模型来优化向量表示的准确性。通过了解源码,我们可以更好地理解Word2Vec的原理和实现过程,并且可以根据需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值