word2vec是一个将单词转换成向量形式的工具。可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度。
一、理论概述
(主要来源于http://licstar.net/archives/328这篇博客)
1.词向量是什么
自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化。
NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。
举个栗子,
“话筒”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...]
“麦克”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...]
每个词都是茫茫 0 海中的一个 1。
这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。比如刚才的例子中,话筒记为 3,麦克记为 8(假设从 0 开始记)。如果要编程实现的话,用 Hash 表给每个词分配一个编号就可以了。这么简洁的表示方法配合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。
当然这种表示方法也存在一个重要的问题就是“词汇鸿沟”现象:任意两个词之间都是孤立的。光从这两个向量中看不出两个词是否有关系,哪怕是话筒和麦克这样的同义词也不能幸免于难。
Deep Learning 中一般用到的词向量并不是刚才提到的用 One-hot Representation 表示的那种很长很长的词向量,而是用 Distributed Representation(不知道这个应该怎么翻译,因为还存在一种叫“Distributional Representation”(类似,LDA中用topic表示词语的词向量的表示方法)表示的一种低维实数向量。这种向量一般是这个样子:[0.792, −0.177, −0.107, 0.109, −0.542, ...]。维度以 50 维和 100 维比较常见。
2.词向量的来历
Distributed representation 最早是 Hinton 在 1986 年的论文《Learning distributed representations of concepts》中提出的。虽然这篇文章没有说要将词做 Distributed representation但至少这种先进的思想在那个时候就在人们的心中埋下了火种,到 2000 年之后开始逐渐被人重视。
3. 词向量的训练
要介绍词向量是怎么训练得到的,就不得不提到语言模型。到目前为止我了解到的所有训练方法都是在训练语言模型的同时,顺便得到词向量的。
这也比较容易理解,要从一段无标注的自然文本中学习出一些东西,无非就是统计出词频、词的共现、词的搭配之类的信息。而要从自然文本中统计并建立一个语言模型,无疑是要求最为精确的一个任务(也不排除以后有人创造出更好更有用的方法)。既然构建语言模型这一任务要求这么高,其中必然也需要对语言进行更精细的统计和分析,同时也会需要更好的模型,更大的数据来支撑。目前最好的词向量都来自于此,也就不难理解了。
词向量的训练最经典的有 3 个工作,C&W 2008、M&H 2008、Mikolov 2010。当然在说这些工作之前,不得不介绍一下这一系列中 Bengio 的经典之作
4. 词向量的评价
词向量的评价大体上可以分成两种方式,第一种是把词向量融入现有系统中,看对系统性能的提升;第二种是直接从语言学的角度对词向量进行分析,如相似度、语义偏移等。
4.1 提升现有系统
词向量的用法最常见的有两种:
1. 直接用于神经网络模型的输入层。如 C&W 的 SENNA 系统中,将训练好的词向量作为输入,用前馈网络和卷积网络完成了词性标注、语义角色标注等一系列任务。再如 Socher 将词向量作为输入,用递归神经网络完成了句法分析、情感分析等多项任务。
2. 作为辅助特征扩充现有模型。如 Turian 将词向量作为额外的特征加入到接近 state of the art 的方法中,进一步提高了命名实体识别和短语识别的效果。
4.2 语言学评价
还有一个有意思的分析是 Mikolov 在 2013 年刚刚发表的一项发现。他发现两个词向量之间的关系,可以直接从这两个向量的差里体现出来。向量的差就是数学上的定义,直接逐位相减。比如 C(king)−C(queen)≈C(man)−C(woman)。更强大的是,与 C(king)−C(man)+C(woman) 最接近的向量就是 C(queen)。
为了分析词向量的这个特点, Mikolov 使用类比(analogy)的方式来评测。如已知 a 之于 b 犹如 c 之于 d。现在给出 a、b、c,看 C(a)−C(b)+C(c) 最接近的词是否是 d。
在文章 Mikolov 对比了词法关系(名词单复数 good-better:rough-rougher、动词第三人称单数、形容词比较级最高级等)和语义关系(clothing-shirt:dish-bowl)
这些实验结果中最容易理解的是:语料越大,词向量就越好。其它的实验由于缺乏严格控制条件进行对比,谈不上哪个更好哪个更差。不过这里的两个语言学分析都非常有意思,尤其是向量之间存在这种线性平移的关系,可能会是词向量发展的一个突破口。
<!--[if !vml]--><!--[endif]-->
关于Deep Lerning In Nlp的一些相关论文,《Deep Learning in NLP (一)词向量和语言模型》(http://licstar.net/archives/328)这篇博客总结的非常的好。以上内容大多数都是截取原博客内容。
二、实际操作
这篇文章是最近几天看word2vec源码以及相关神经网络训练词向量论文之后的个人小小的总结,主要是针对word2vec的使用,做一下介绍。望大家使用的过程中,少走弯路。
word2vec工具中包含了对两种模型的训练,如下图。在训练每种模型的时候又分HS和NEG两种方法。(看图就可以发现,其实word2vec并不deep……)
<!--[if !vml]--><!--[endif]-->
除了google自己的word2vec工具,各位对词向量感兴趣的牛人们也相继编写了各自不同的版本。其中比较好用的是Python Gensim主题模型包中的word2vec,但通过阅读其源码python版本只实现了skip-gram模型,并且只实现了通过分层softmax方法对其训练,并没有使用negative sampling。下面列举一下目前出现的版本以及相对应的地址,供大家选择。如下表:
版本 |
地址 |
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
|
未知 |
未知 |
未知 |
未知 |
以上代码,C++版本的我没有看过。最权威的当然是C语言版本,但是阅读起来比较困难一点。Python版本有优化处理,所以速度相对来说也不慢,但只是实现了分层softmax方法对skip-gram模型进行训练。Java版本分别实现了分层softmax方法对CBOW模型和skip-gram模型进行训练。C++版本的没有阅读其代码,所以未知……
使用之前,先贴一些论文中对两个模型和不同方法的评价图片,方便大家根据不同任务进行不同训练。
<!--[if !vml]--><!--[endif]-->
<!--[if !vml]--><!--[endif]-->
下面以c语言正式版本为例,来介绍word2vec的使用。
首先我们将google word2vec项目源码checkout 到本机,具体地址是http://word2vec.googlecode.com/svn/trunk/ 使用ssh登录实验室Linux服务器,地址192.168.1.143。将刚才checkout的文件,上传到服务器中。
<!--[if !vml]--><!--[endif]-->
进入目录,命令行输入make指令,进行编译。
<!--[if !vml]--><!--[endif]-->
<!--[if !vml]-->这样我们就可以开始使用,word2vec工具了。
1.将文本语料进行分词,以空格,tab隔开都可以,中文分词工具可以使用张华平博士的NLPIR2013http://ictclas.nlpir.org/ 喜欢用Python 的童鞋也可以使用结巴分词https://github.com/fxsjy/jieba。
2.将分好词的训练语料进行训练,假定我语料名称为test.txt且在word2vec目录中。输入命令:
./word2vec -train test.txt -output vectors.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1
以上命令表示的是输入文件是test.txt,输出文件是vectors.bin,不使用cbow模型,默认为Skip-Gram模型。 每个单词的向量维度是200,训练的窗口大小为5就是考虑一个词前五个和后五个词语(实际代码中还有一个随机选窗口的过程,窗口大小<=5)。不使用NEG方法,使用HS方法。-sampe指的是采样的阈值,如果一个词语在训练样本中出现的频率越大,那么就越会被采样。-binary为1指的是结果二进制存储,为0是普通存储(普通存储的时候是可以打开看到词语和对应的向量的)除了以上命令中的参数,word2vec还有几个参数对我们比较有用比如-alpha设置学习速率,默认的为0.025.–min-count设置最低频率,默认是5,如果一个词语在文档中出现的次数小于5,那么就会丢弃。-classes设置聚类个数,看了一下源码用的是k-means聚类的方法。
<!--[if !supportLists]-->· <!--[endif]-->架构:skip-gram(慢、对罕见字有利)vs CBOW(快)
<!--[if !supportLists]-->· <!--[endif]-->训练算法:分层softmax(对罕见字有利)vs 负采样(对常见词和低纬向量有利)
<!--[if !supportLists]-->· <!--[endif]-->欠采样频繁词:可以提高结果的准确性和速度(适用范围1e-3到1e-5)
<!--[if !supportLists]-->· <!--[endif]-->文本(window)大小:skip-gram通常在10附近,CBOW通常在5附近
3.训练好模型之后,得到vectors.bin这个模型文件。vectors.bin这个文件就是文档中词语和其对应的向量,这个向量的维度是你训练时设置的参数大小。下面我们可以利用这个model做很多自然语言处理的任务了。Google代码里面提供了distance的一个应用,说白了就是读取模型文件中每一个词和其对应的向量,计算所输入query的词,与其他所有词语的cosine相似度,排序,返回结果。同理训练命令中的-classes参数,也是获取每个词对应的向量之后,对词语进行k-means聚类。对于训练出来的模型进行操作,我推荐大家使用http://blog.csdn.net/zhaoxinfan/article/details/11640573这个java版本的模型读取类,比较方便,读取模型之后大家就可以来实现各种各样有趣的东西了。下面举几个例子:
a.计算两个词语相似度,如图1计算asp与net的相似度为0.6215127<!--[endif]-->
图1
b.列出所有相似词语列表,如图2为“php”的结果。
<!--[if !vml]--><!--[endif]-->
图二
c.寻找对应关系:如图3: 男人-男孩 女人-? 如图4:内蒙-呼和浩特 河北-?
<!--[if !vml]--><!--[endif]-->
图3
<!--[if !vml]--><!--[endif]-->
图4
d.删选不合群的词语,可以用来做特征选择:如图5所示:
<!--[if !vml]--><!--[
相关推荐
在提供的压缩包文件中,可能包含了使用Word2vec进行词向量实验的指导文档。这份文档可能涵盖了如何安装和运行Word2vec工具,如何准备训练数据,以及如何评估和可视化词向量效果等内容。对于初学者来说,通过阅读这份...
本文提出了一种结合 Word2vec 和 LDA 的文本特征表示模型,该模型能够有效地表示单词的语义特征和上下文特征,并使用卷积神经网络(CNN)进行文本分类实验。该模型可以解决传统机器学习分类算法的缺陷,如特征表示...
对于word2vec,README文件可能会指导用户如何编译源代码、运行模型训练和测试,以及解释输出结果。 **编译与安装word2vec** 编译word2vec源码通常涉及以下步骤: 1. **解压文件**:使用`tar -zxvf word2vec-2014-...
总的来说,这篇博客资源提供了一个完整的流程,指导读者如何利用word2vec进行情感分析。通过深入学习和理解word2vec的工作原理及其在情感分析中的应用,可以提升NLP项目的效果,并对文本数据的理解和处理有更深刻的...
总的来说,《word2vec中的数学原理详解》这篇资料深入浅出地解析了word2vec模型的核心概念和数学机制,对理解自然语言处理中的词向量学习具有重要的指导价值。无论是对NLP研究者还是开发者,理解这些原理都将有助于...
word2vec 是一种在自然语言处理领域广泛使用的词...同时,从文档提供的内容来看,本文档虽然出现了一些OCR扫描导致的识别错误,但仍不难看出它对于读者深入理解word2vec模型的数学原理及框架有着重要的帮助和指导作用。
嵌入表示学习是当下研究热点,从word2vec,到node2vec, 到graph2vec,出现大量X2vec的算法。但如何构建向量嵌入理论指导算法设计?最近RWTH Aachen大学的计算机科学教授ACM Fellow Martin Grohe教授给了《X2vec: ...
在深入探讨《基于Word2Vec的云设计服务匹配方法研究》这一论文的内容时,我们首先要理解Word2Vec作为一种词向量技术在数据服务与云技术中的应用,以及它如何被应用于云设计服务平台,解决服务匹配问题。 Word2Vec是...
2. **Python编程**:使用Python编程语言,介绍如何安装和使用Gensim、TensorFlow等工具库来实现Word2vec。 3. **数据预处理**:如何清洗和构建语料库,以及分词和词性标注等步骤。 4. **模型训练**:详细指导如何...
Word2vec是一种广泛使用的词向量生成算法,它可以捕捉词语之间的语义和语法关系,对于深度学习模型的理解文本具有重要意义。TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索与文本挖掘的...
word2vec管道 Word2vec是一个研究和探索管道,旨在分析生物医学资助,出版物摘要和其他自然语言...word2vec的管道参数和选项通过运行,可访问默认值以指导新项目。 配置文件中的括号部分概述了word2vec管道的每个步骤;
在IT领域,word2vec是一种广泛使用的自然语言处理(NLP)工具,它是由Google开发的,用于将单词转换为连续向量表示。这个工具基于两种模型:CBOW(Continuous Bag of Words)和Skip-gram,能够捕捉到词汇之间的语义...
微博评论文本情感分析(word2vec和svm模型)项目源码.zip 已获导师指导并通过的97分的高分期末大作业项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 微博评论文本情感分析(word2...
在深度理解word2vec的过程中,我们需要掌握的关键知识点可以分为以下几个方面: ### 1. 词向量及其应用 #### 1.1 什么是词向量? 词向量,也称作“词嵌入”,是一种将词语以数值形式表示的方式,它能够编码词语的...
《word2Vec训练》是一个关于自然语言处理领域的压缩包,主要包含了实现《Distributed Representations of Words and Phrases and their Compositionality》论文中提出的词向量训练方法的资源。词向量是自然语言处理...
该方法使用Word2vec对医疗文本数据进行特征提取,并将提取的特征输入到卷积神经网络中以进行预测。实验结果表明,该方法在不同输入数据数量和不同预测方面都具有良好的性能。 知识点: 1. Word2vec: Word2vec是一...
本文主要探讨了如何利用Word2vec与BP神经网络技术来解决医学病历症状的自动分类问题。在医疗行业中,电子病历的非结构化文本信息处理是一项挑战,因为这些信息通常是长篇且无序的。通过这两种算法的结合应用,可以...