本文是讲述怎样使用word2vec的基础教程。文章比較基础,希望对你有所帮助!

官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/

官网Python下载地址:http://radimrehurek.com/gensim/models/word2vec.html

1.简介

參考:《Word2vec的核心架构及其应用 · 熊富林。邓怡豪,唐晓晟 · 北邮2015年》

          《Word2vec的工作原理及应用探究 · 周练 · 西安电子科技大学2014年》

          《Word2vec对中文词进行聚类的研究 · 郑文超,徐鹏 · 北京邮电大学2013年》



PS:第一部分主要是给大家引入基础内容作铺垫,这类文章非常多。希望大家自己去学习很多其它更好的基础内容,这篇博客主要是介绍Word2Vec对中文文本的使用方法。

(1) 统计语言模型

统计语言模型的一般形式是给定已知的一组词,求解下一个词的条件概率。形式例如以下:

统计语言模型的一般形式直观、准确,n元模型中如果在不改变词语在上下文中的顺序前提下,距离相近的词语关系越近。距离较远的关联度越远,当距离足够远时,词语之间则没有关联度。

但该模型没有全然利用语料的信息:

1) 没有考虑距离更远的词语与当前词的关系。即超出范围n的词被忽略了。而这两者非常可能有关系的。

比如,“华盛顿是美国的首都”是当前语句,隔了大于n个词的地方又出现了“北京是中国的首都”,在n元模型中“华盛顿”和“北京”是没有关系的,然而这两个句子却隐含了语法及语义关系,即”华盛顿“和“北京”都是名词。而且各自是美国和中国的首都。



2) 忽略了词语之间的相似性。即上述模型无法考虑词语的语法关系。

比如,语料中的“鱼在水中游”应该可以帮助我们产生“马在草原上跑”这种句子,由于两个句子中“鱼”和“马”、“水”和“草原”、“游”和“跑”、“中”和“上”具有同样的语法特性。

而在神经网络概率语言模型中。这两种信息将充分利用到。



(2) 神经网络概率语言模型

神经网络概率语言模型是一种新兴的自然语言处理算法。该模型通过学习训练语料获取词向量和概率密度函数。词向量是多维实数向量,向量中包括了自然语言中的语义和语法关系。词向量之间余弦距离的大小代表了词语之间关系的远近,词向量的加减运算则是计算机在"遣词造句"。



神经网络概率语言模型经历了非常长的发展阶段,由Bengio等人2003年提出的神经网络语言模型NNLM(Neural network language model)最为知名,以后的发展工作都參照此模型进行。

历经十余年的研究,神经网络概率语言模型有了非常大发展。

现在在架构方面有比NNLM更简单的CBOW模型、Skip-gram模型;其次在训练方面,出现了Hierarchical Softmax算法、负採样算法(Negative Sampling),以及为了减小频繁词对结果准确性和训练速度的影响而引入的欠採样(Subsumpling)技术。

上图是基于三层神经网络的自然语言预计模型NNLM(Neural Network Language Model)。NNLM能够计算某一个上下文的下一个词为wi的概率,即(wi=i|context)。词向量是其训练的副产物。NNLM依据语料库C生成相应的词汇表V。



神将网络知识能够參考我的前文博客:神经网络和机器学习基础入门分享

NNLM推荐Rachel-Zhang大神文章:word2vec——高效word特征求取

近年来,神经网络概率语言模型发展迅速。Word2vec是最新技术理论的合集。

Word2vec是Google公司在2013年开放的一款用于训练词向量的软件工具。所以。在讲述word2vec之前。先给大家介绍词向量的概念。



(3) 词向量

參考:licstar大神的NLP文章 Deep Learning in NLP (一)词向量和语言模型

正如作者所说:Deep Learning 算法已经在图像和音频领域取得了惊人的成果,可是在 NLP 领域中尚未见到如此激动人心的结果。

有一种说法是。语言(词、句子、篇章等)属于人类认知过程中产生的高层认知抽象实体,而语音和图像属于较为底层的原始输入信号。所以后两者更适合做deep learning来学习特征。

可是将词用“词向量”的方式表示可谓是将 Deep Learning 算法引入 NLP 领域的一个核心技术。

自然语言理解问题转化为机器学习问题的第一步都是通过一种方法把这些符号数学化。



词向量具有良好的语义特性。是表示词语特征的经常使用方式。

词向量的每一维的值代表一个具有一定的语义和语法上解释的特征。故能够将词向量的每一维称为一个词语特征。词向量用Distributed Representation表示。一种低维实数向量。

比如,NLP中最直观、最经常使用的词表示方法是One-hot Representation。每一个词用一个非常长的向量表示,向量的维度表示词表大小,绝大多数是0,仅仅有一个维度是1,代表当前词。

“话筒”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …] 即从0開始话筒记为3。

但这样的One-hot Representation採用稀疏矩阵的方式表示词,在解决某些任务时会造成维数灾难,而使用低维的词向量就非常好的攻克了该问题。同一时候从实践上看,高维的特征假设要套用Deep Learning,其复杂度差点儿是难以接受的,因此低维的词向量在这里也饱受追捧。

Distributed Representation低维实数向量,如:[0.792, −0.177, −0.107, 0.109, −0.542, …]。它让相似或相关的词在距离上更加接近。



总之,Distributed Representation是一个稠密、低维的实数限量。它的每一维表示词语的一个潜在特征,该特征捕获了实用的句法和语义特征。

其特点是将词语的不同句法和语义特征分布到它的每个维度上去表示。

推荐我前面的基础文章:Python简单实现基于VSM的余弦相似度计算



(4) Word2vec

參考:Word2vec的核心架构及其应用 · 熊富林,邓怡豪,唐晓晟 · 北邮2015年

Word2vec是Google公司在2013年开放的一款用于训练词向量的软件工具。它依据给定的语料库,通过优化后的训练模型高速有效的将一个词语表达成向量形式,其核心架构包含CBOW和Skip-gram。



在開始之前,引入模型复杂度,定义例如以下:

                                                      O = E * T * Q

当中,E表示训练的次数,T表示训练语料中词的个数,Q因模型而异。E值不是我们关心的内容,T与训练语料有关,其值越大模型就越准确,Q在以下讲述详细模型是讨论。

NNLM模型是神经网络概率语言模型的基础模型。在NNLM模型中,从隐含层到输出层的计算时主要影响训练效率的地方,CBOW和Skip-gram模型考虑去掉隐含层。实践证明新训练的词向量的准确度可能不如NNLM模型(具有隐含层),但能够通过添加训练语料的方法来完好。

Word2vec包括两种训练模型。各自是CBOW和Skip_gram(输入层、发射层、输出层),例如以下图所看到的:

CBOW模型:

理解为上下文决定当前词出现的概率。在CBOW模型中,上下文全部的词对当前词出现概率的影响的权重是一样的,因此叫CBOW(continuous bag-of-words model)模型。如在袋子中取词。取出数量足够的词就能够了。至于取出的先后顺序是无关紧要的。



Skip-gram模型:

Skip-gram模型是一个简单有用的模型。为什么会提出该问题呢?

在NLP中,语料的选取是一个相当重要的问题。

首先,语料必须充分。

一方面词典的词量要足够大。还有一方面尽可能地包括反映词语之间关系的句子。如“鱼在水中游”这样的句式在语料中尽可能地多。模型才干学习到该句中的语义和语法关系,这和人类学习自然语言是一个道理,反复次数多了,也就会模型了。

其次,语料必须准确。所选取的语料可以正确反映该语言的语义和语法关系。

如中文的《人民日报》比較准确。

但很多其它时候不是语料选取引发准确性问题,而是处理的方法。

因为窗体大小的限制,这会导致超出窗体的词语与当前词之间的关系不能正确地反映到模型中。假设单纯扩大窗体大小会添加训练的复杂度。Skip-gram模型的提出非常好攻克了这些问题。

Skip-gram表示“跳过某些符号”。比如句子“中国足球踢得真是太烂了”有4个3元词组,各自是“中国足球踢得”、“足球踢得真是”、“踢得真是太烂”、“真是太烂了”。句子的本意都是“中国足球太烂”,但是上面4个3元组并不能反映出这个信息。

此时,使用Skip-gram模型同意某些词被跳过,因此可组成“中国足球太烂”这个3元词组。

假设同意跳过2个词,即2-Skip-gram,那么上句话组成的3元词组为:

由上表可知:一方面Skip-gram反映了句子的真实意思,在新组成的这18个3元词组中,有8个词组可以正确反映例句中的真实意思;还有一方面,扩大了语料。3元词组由原来的4个扩展到了18个。

语料的扩展可以提高训练的精确度。获得的词向量更能反映真实的文本含义。

2.下载源代码

下载地址:http://word2vec.googlecode.com/svn/trunk/

使用SVN Checkout源码,例如以下图所看到的。


3.中文语料

PS:最后附有word2vec源代码、三大百科语料、腾讯新闻语料和分词python代码。

中文语料能够參考我的文章。通过Python下载百度百科、互动百科、维基百科的内容。

        [python] lantern訪问中文维基百科及selenium爬取维基百科语料

        [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒



下载结果例如以下图所看到的,共300个国家,百度百科、互动百科、维基百科各自100个,相应的编号都是0001.txt~0100.txt。每一个txt中包括一个实体(国家)的信息。

然后再使用Jieba分词工具对齐进行中文分词和文档合并。

#encoding=utf-8
import sys
import re
import codecs
import os
import shutil
import jieba
import jieba.analyse #导入自己定义词典
jieba.load_userdict("dict_all.txt") #Read file and cut
def read_file_cut():
#create path
pathBaidu = "BaiduSpiderCountry\\"
resName = "Result_Country.txt"
if os.path.exists(resName):
os.remove(resName)
result = codecs.open(resName, 'w', 'utf-8') num = 1
while num<=100: #5A 200 其他100
name = "%04d" % num
fileName = pathBaidu + str(name) + ".txt"
source = open(fileName, 'r')
line = source.readline() while line!="":
line = line.rstrip('\n')
#line = unicode(line, "utf-8")
seglist = jieba.cut(line,cut_all=False) #精确模式
output = ' '.join(list(seglist)) #空格拼接
#print output
result.write(output + ' ') #空格代替换行'\r\n'
line = source.readline()
else:
print 'End file: ' + str(num)
result.write('\r\n')
source.close()
num = num + 1
else:
print 'End Baidu'
result.close() #Run function
if __name__ == '__main__':
read_file_cut()

上面仅仅显示了对百度百科100个国家进行分词的代码,但核心代码一样。同一时候。假设须要对停用词过滤或标点符号过滤能够自己定义实现。

分词详见: [python] 使用Jieba工具中文分词及文本聚类概念

分词合并后的结果为Result_Country.txt。相当于600行,每行相应一个分词后的国家。

4.执行源代码

强烈推荐三篇大神介绍word2vec处理中文语料的文章,当中Felven好像是师兄。

        Windows下使用Word2vec继续词向量训练 - 一仅仅鸟的天空

        利用word2vec对关键词进行聚类 - Felven

        http://www.52nlp.cn/中英文维基百科语料上的word2vec实验

        word2vec 词向量工具 - 百度文库



由于word2vec须要linux环境,全部首先在windows下安装linux环境模拟器。推荐cygwin。然后把语料Result_Country.txt放入word2vec文件夹下,改动demo-word.sh文件,该文件默认情况下使用自带的text8数据进行训练,假设训练数据不存在,则会进行下载。由于须要使用自己的数据进行训练,故凝视掉下载代码。



demo-word.sh文件改动例如以下:

make
#if [ ! -e text8 ]; then
# wget http://mattmahoney.net/dc/text8.zip -O text8.gz
# gzip -d text8.gz -f
#fi
time ./word2vec -train Result_Country.txt -output vectors.bin -cbow 1 -size 200 -window 8 -negative 25 -hs 0 -sample 1e-4 -threads 20 -binary 1 -iter 15
./distance vectors.bin

下图參数源自文章:Windows下使用Word2vec继续词向量训练 - 一仅仅鸟的天空

执行命令sh demo-word.sh,等待训练完毕。模型训练完毕之后,得到了vectors.bin这个词向量文件,能够直接运用。

5.结果展示

通过训练得到的词向量我们能够进行对应的自然语言处理工作。比方求相似词、关键词聚类等。

当中word2vec中提供了distance求词的cosine相似度。并排序。也能够在训练时,设置-classes參数来指定聚类的簇个数。使用kmeans进行聚类。

cd C:/Users/dell/Desktop/word2vec
sh demo-word.sh
./distance vectors.bin

输入阿富汗:喀布尔(首都)、坎大哈(主要城市)、吉尔吉斯斯坦、伊拉克等。

输入国歌:

输入首都:

输入GDP:

最后希望文章对你有所帮助,主要是使用的方法。

同一时候很多其它应用须要你自己去研究学习。

word2vec源代码、语料下载地址:

        http://download.csdn.net/detail/eastmount/9434889

(By:Eastmount 2016-02-18 深夜1点  http://blog.csdn.net/eastmount/ )

word2vec词向量训练及中文文本类似度计算的更多相关文章

  1. 文本分布式表示(三):用gensim训练word2vec词向量

    今天参考网上的博客,用gensim训练了word2vec词向量.训练的语料是著名科幻小说<三体>,这部小说我一直没有看,所以这次拿来折腾一下. <三体>这本小说里有不少人名和一 ...

  2. word2vec词向量处理中文语料

    word2vec介绍 word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间 ...

  3. 3. 文本相似度计算-DSSM算法

    1. 文本相似度计算-文本向量化 2. 文本相似度计算-距离的度量 3. 文本相似度计算-DSSM算法 4. 文本相似度计算-CNN-DSSM算法 1. 前言 最近在学习文本相似度的计算,前面两篇文章 ...

  4. 转:Python 文本挖掘:使用gensim进行文本相似度计算

    Python使用gensim进行文本相似度计算 转于:http://rzcoding.blog.163.com/blog/static/2222810172013101895642665/ 在文本处理 ...

  5. python 文本相似度计算

    参考:python文本相似度计算 原始语料格式:一个文件,一篇文章. #!/usr/bin/env python # -*- coding: UTF-8 -*- import jieba from g ...

  6. 4. 文本相似度计算-CNN-DSSM算法

    1. 文本相似度计算-文本向量化 2. 文本相似度计算-距离的度量 3. 文本相似度计算-DSSM算法 4. 文本相似度计算-CNN-DSSM算法 1. 前言 之前介绍了DSSM算法,它主要是用了DN ...

  7. 机器学习入门-文本特征-word2vec词向量模型 1.word2vec(进行word2vec映射编码)2.model.wv['sky']输出这个词的向量映射 3.model.wv.index2vec(输出经过映射的词名称)

    函数说明: 1. from gensim.model import word2vec  构建模型 word2vec(corpus_token, size=feature_size, min_count ...

  8. word2vec词向量处理英文语料

    word2vec介绍          word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够根据输入的词的集 ...

  9. 机器学习之路: python 实践 word2vec 词向量技术

    git: https://github.com/linyi0604/MachineLearning 词向量技术 Word2Vec 每个连续词汇片段都会对后面有一定制约 称为上下文context 找到句 ...

随机推荐

  1. 漫说好管理vs.坏管理

    天地会珠海分舵注:本文英文版来自Medium今日热点头条.漫画简单明了,全文差点儿没有多余的语言去装饰.两天内获得两千三百多个推荐,且读者的反馈也相当的热烈.中文版由天地会珠海分舵编译后分享给大家. ...

  2. [ES6] Proxy & Reflect

    Proxy and Reflect API works nicely together. About how to use Proxy, check this post. Let's see abou ...

  3. 分布式公布订阅消息系统 Kafka 架构设计

    我们为什么要搭建该系统 Kafka是一个消息系统,原本开发自LinkedIn,用作LinkedIn的活动流(activity stream)和运营数据处理管道(pipeline)的基础. 如今它已为多 ...

  4. hdu1181(变形课)

    点击打开链接 Problem Description 呃......变形课上Harry碰到了一点小麻烦,由于他并不像Hermione那样可以记住全部的咒语而任意的将一个棒球变成刺猬什么的,可是他发现了 ...

  5. 【Android 系统开发】使用 Source InSight 阅读 Android 源代码

    1. 安装 Source Insight (1) Source Insight 相关资源 安装相关资源 : -- 下载地址 : http://www.sourceinsight.com/down35. ...

  6. QFileSystemModel只显示名称,不显示size,type,modified

    Qt 提供的 QFileSystemModel可以提供文件目录树预览功能,但是预览的都自带了Name,size,type, modified等信息.我现在只想显示name这一列,不想显示size,ty ...

  7. php如何判断两个时间戳是一天

    $date1 = getdate(strtotime('2013-12-31')); $date11 = getdate(strtotime('2014-01-01')); $date2 = getd ...

  8. python之路——装饰器函数

    阅读目录 楔子 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一个函数 返回顶部 楔子 作为一个会写函数的python开发,我们从今天开始要去公司上班 ...

  9. android编译ffmpeg+x264

    下载最新版的x264ftp://ftp.videolan.org/pub/videolan/x264/snapshots/1.解压到指定的目录2.切换当前目录为该目录3.创建一个shell脚本buil ...

  10. 基于Doxygen的C/C++注释原则

    基于Doxygen的C/C++注释原则 标注总述 .文件头标注 . 命名空间标注 . 类.结构.枚举标注 . 函数注释原则 . 变量注释 . 模块标注 . 分组标注 总述 华丽的分隔线 //----- ...