前两天怒刷微博,突然发现了刘知远老师分享的微博,顿时眼前一惊。原Po例如以下:

http://weibo.com/1464484735/BhbLD70wa

因为我眼下的研究方向是word2vec。暗自折服于它在word analogy task上狂暴吊炸天的能力,对于glove这样能够击败word2vec的大牛,也必定会产生好奇心。

于是便对它做了初步分析,便有了本文,希望能够抛砖引玉。期待很多其它人对这方面的研究。

因为本人学术水平不够,本文不会涉及glove详细实现的方法,不过介绍怎样使用官网代码,并利用python脚本,将glove训练好的model读取,(仿照word2vec)计算随意单词的最相似的TOP N个单词,并利用kmeans对单词进行聚类。用于与word2vec比較结果。

首先,先发出这个paper的homepage:

http://www.socher.org/index.php/Main/GloveGlobalVectorsForWordRepresentation

今天更新发现跳转到例如以下页面:

http://nlp.stanford.edu/projects/glove/

这里能够找到几个他们用wekipida训练好的model,只是我们一开是不须要关心这个,我们须要关心的是源码所在的位置,也就是:

http://nlp.stanford.edu/software/glove.tar.gz

下载好glove.tar.gz,基本就能够開始训练了。大家从它的后缀名就应该猜出来,它也是须要在linux下编译执行的程序。各位用windows的。仅仅能參考当初怎样用cygwin解决执行word2vec的方法了。(这也不会是本文重点,各位加油!)在linux下解压该文件:

tar -xzvf glove.tar.gz

进入glove文件夹下,首先先參考README.txt,里面主要介绍这个程序包括了四部分子程序,按步骤各自是vocab_count、cooccur、shuffle、glove。本人用拙劣的翻译技巧大概为各位介绍下每部分要做的事情。假设有介绍错误的。还望指出:

1.vocab_count:用于计算原文本的单词统计(生成vocab.txt,每一行为:单词  词频)

2.cooccur:用于统计词与词的共现。目測类似与word2vec的窗体内的随意两个词(生成的是cooccurrence.bin,二进制文件,呵呵)

3. shuffle:对于2中的共现结果又一次整理(一看到shuffle瞬间想到hadoop,生成的也是二进制文件cooccurrence.shuf.bin)

4.glove:glove算法的训练模型,会运用到之前生成的相关文件(1&3),终于会输出vectors.txt和vectors.bin(前者直接能够打开,下文主要针对它做研究。后者还是二进制文件)

上面已经介绍了这个程序的运行流程,以下就详细训练出这个vectors.txt。

首先二话不说。直接

make

编译程序,假设报错。那仅仅能呵呵了,自己研究下报错原因。多半可能是gcc版本号不正确,我用的是4.7.3。

假设编译通过了,你要注意的是,事实上大牛早就已经给你写好了运行程序。就是demo.sh,你须要做的就是简单的一步:

sh demo.sh

假设报错说权限不够,相信各位大牛一定知道怎样改动权限,我就是最暴力的:

chmod 777 glove/*

我在执行的时候报了:

demo.sh: 26: demo.sh: [[: not found

这种错误。为了解决这个错误,我打开了恐怖的demo.sh,发现它做的任务很easy。首先它自己一開始就make了(笔者上述的make操作略显多余),接下来去下那个text8(目測和word2vec是同一个东西),接下来定义了一系列常量,然后运行了四步操作。因为笔者对bash的不熟悉。笔者就暴力的把里面的全部的if都干掉了,训练部分代码变成例如以下这样:

./vocab_count -min-count $VOCAB_MIN_COUNT -verbose $VERBOSE < $CORPUS > $VOCAB_FILE

./cooccur -memory $MEMORY -vocab-file $VOCAB_FILE -verbose $VERBOSE -window-size $WINDOW_SIZE < $CORPUS > $COOCCURRENCE_FILE

./shuffle -memory $MEMORY -verbose $VERBOSE < $COOCCURRENCE_FILE > $COOCCURRENCE_SHUF_FILE

./glove -save-file $SAVE_FILE -threads $NUM_THREADS -input-file $COOCCURRENCE_SHUF_FILE -x-max $X_MAX -iter $MAX_ITER -vector-size $VECTOR_SIZE -binary $BINARY -vocab-file $VOCAB_FILE -verbose $VERBOSE

octave -nodisplay -nodesktop -nojvm -nosplash < ./eval/read_and_evaluate.m 1>&2

各位不要笑我,训练出model先。最后运行sh demo.sh,成功生成vectors.txt。

(说句题外话,我们能够从glove的參数看得出来,人家也是支持多线程的。在text8语料库训练50维向量。我花了7分钟时间《i5 core+4g内存》,还没有来得及和word2vec对照时间。感觉比word2vec慢)可是还是会报错,详细错误就不显示。主要是由于这个demo.sh接下来调用自己在eval目录下写好的matlab代码来分析结果,无奈我Linux下没有安装matlab,我还自做聪明的把matlab改动成octave(见刚刚的第四行),但还是不行,就在这时,我得到张成老师的给力回复:

瞬间发现自己好傻,明明已经生成了vectors.txt。为啥还要用它的matlab代码调用,于是就有了例如以下的脚本文件:

https://github.com/eclipse-du/glove_py_model_load/blob/master/glove_dist.py

能够看到,我这个脚本函数使用到了两个第三方类库,各自是numpy和sklearn。希望没有装的朋友安装下,详细安装方法在此就不再赘述,有问题的能够和我交流。

这里说个插曲,我打开vectors.txt的时候发现它就是每行用空格切割,为首的是单词,后面接着就是这个单词所相应的向量,为了对照,我又打开了word2vec训练出来的vectors.txt(注意-binary 0)发现二者唯一的差别是,word2vec会在一開始写下单词个数与向量的维度。因此一个邪恶的念头在我脑海中飘过(自己在开头补上单词个数和向量维度),然后就能够被当成是word2vec的bin来被调用。这样可行吗?我一上来遇到个挫折,就是word2vec的原版.distance仅仅支持2进制的model的读入,但我不放弃,总算在python版本号的实现(gensim)中发现了load方法,为例如以下代码:

from gensim.models import Word2Vec

model = Word2Vec.load_word2vec_format(‘vectors.txt’, binary=False)

喜欢调用gensim的其它函数的人能够自行玩耍。

说完插曲,能够看看我慘不忍睹的代码。假设不说我的list comprehensive 运行了两次split。也不说我的top k排序是基于所有排序的前K个(按理说K小的时候。用堆排序或者冒泡会更快),更不说我一上来没有进行向量归一化来降低计算时间,在这种情况下,我认为我的代码还是基本完毕任务了。

基本的两个函数分别用来进行余弦计算和找出与当前单词最相近的K个单词。以下又利用sklearn的kmeans对词向量聚类,本人已经用中文文本训练完毕。但因为时间限制,本文还是继续介绍怎样在维基的数据进行聚类。我会在以后的博客中介绍怎样对中文进行glove学习和聚类(假设还有下文)。

我特地在代码结尾出打印出china和father所相应的类别数(本例中为80和76),进入相相应的类别查看所属类别词。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRvb2Fkb28=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="215" height="695" alt="">

我们能够看出,在china所相应的类别中,包括了非常多国家名,比方,germany,ireland, scotland等。在father所相应的第76类中,也包括了很多相关词汇,包括:child,son,wife,king。

当然我仅仅是列举几个好的,里面也包括非常多杂质,并且非常多类别以笔者的词汇是不清楚其详细的聚类含义。只是我们能够用这个100M的文本大体看到glove的初态,也算对得起入门二字。

最后把我训练好的vectors.txt和result目录放到github上,供大家查对结果:

https://github.com/eclipse-du/glove_py_model_load

下一步笔者会打算比較word2vec和glove的结果。以及分析glove运用在中文上面的效果,假设你们愿意看的话,去github上点个star(赞)。那样会加快我码文章的积极性。(弄到一点多不easy啊~~~)

假设对安装和我的脚本有不论什么疑问。欢迎及时和我联系。

glove入门实战的更多相关文章

  1. Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...

  2. 003-Tuple、Array、Map与文件操作入门实战

    003-Tuple.Array.Map与文件操作入门实战 Tuple 各个元素可以类型不同 注意索引的方式 下标从1开始 灵活 Array 注意for循环的until用法 数组的索引方式 上面的for ...

  3. Scala深入浅出实战经典-----002Scala函数定义、流程控制、异常处理入门实战

    002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 ...

  4. Spark入门实战系列--1.Spark及其生态圈简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...

  5. Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建

    [注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.Spark编译与部署将以CentOS 64位操作系统为基础,主要是考虑到实际应用 ...

  6. Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Hadooop 1.1 搭建环境 1.1.1 安装并设置maven 1. 下载mave ...

  7. Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Spark .时间不一样,SBT是白天编译,Maven是深夜进行的,获取依赖包速度不同 ...

  8. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spar ...

  9. Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 . 安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语 ...

随机推荐

  1. [Tailwind] Control What Variations are Generated for Each Utility Class Module in Tailwind

    In this lesson, we learn how to control what utility classes are generated for each utility class mo ...

  2. 一点一点学架构(四)—Spring.NET错误Cannot Resolve Type……

    背景 在搭建完项目框架之后,当我利用单元測试来測一条线时.出现了下面错误: Cannot resolve type[--]for object with name 'ButtonBll' define ...

  3. Android中XML解析,保存的三种方法

    简单介绍 在Android开发中,关于XML解析有三种方式,各自是: SAX 基于事件的解析器.解析速度快.占用内存少.非常适合在Android移动设备中使用. DOM 在内存中以树形结构存放,因此检 ...

  4. iOS实现抽屉效果

    抽屉效果 在iOS中非常多应用都用到了抽屉效果,比如腾讯的QQ,百度贴吧- --- 1. 终于效果例如以下图所看到的 --- 2.实现步骤 1.開始启动的时候.新建3个不同颜色的View的 1.设置3 ...

  5. AngularJS 下拉列表demo

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...

  6. linux中openssl生成证书和自签证书

    1.首先要生成服务器端的私钥(key文件): 命令: openssl genrsa -des3 -out server.key 1024 运行时会提示输入密码,此密码用于加密key文件(参数des3便 ...

  7. 本地PC安裝Centos 6.5 操作手冊

    http://www.xlgps.com/article/130038.html 一.准备工作 1.下载Centos6.5 ISO文件 我在官网上下的6.5版本CentOS-6.5-x86_64-bi ...

  8. webapi+DataTables

    webapi + datatables 前言 之前写过一个关于DataTables的记录,是之前做webform的时候从后台一次性生成html代码,有很多弊端,就不多说了. 这次把最近研究的DataT ...

  9. Vue 菜单栏点击实现高亮显示

    步骤: 遍历对象(goods)获取菜单栏每一项的对象(item)和下标(index) 添加点击事件toggle(),传入下标参数:@click="fn1();fn2()" 动态切换 ...

  10. 关于flex布局中的兼容性问题

    这几天在做项目中用到了flex布局,但是在测试的过程中发现他的兼容性实在是太差了,仅仅用到水平和垂直居中的样式,没想到兼容性代码就写了好几行. display:flex; display:-webki ...