自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 词向量源码解析:(6.7)fasttext源码解析之词向量1

下面我们看一下怎么用fasttext生成词向量。我们执行word-vector-example.sh文件可以得到考虑了subword的词向量。首先看一下这个脚本。首先是下载语料和测试集,下载语料的以后解压并且用wikifil.pl对语料进行预处理,得到纯文本if [ ! -f "${DATADIR}/fil9" ]then  wget -c http://mattmahoney.net

2017-10-22 00:30:39 1216

原创 词向量源码解析:(6.6)fasttext源码解析之词向量1

下面我们看一下怎么用fasttext生成词向量。我们执行word-vector-example.sh文件可以得到考虑了subword的词向量。首先看一下这个脚本。首先是下载语料和测试集,下载语料的以后解压并且用wikifil.pl对语料进行预处理,得到纯文本if [ ! -f "${DATADIR}/fil9" ]then  wget -c http://mattmahoney.net

2017-10-06 08:35:06 1518

原创 词向量源码解析:(6.5)fasttext源码解析之文本分类4

下面说一下测试和预测,测试和预测分别调用了test和predict函数int main(int argc, char** argv) {  if (argc     printUsage();    exit(EXIT_FAILURE);  }  std::string command(argv[1]);  if (command == "skipgram" || co

2017-09-29 19:47:44 2089

原创 词向量源码解析:(6.4)fasttext源码解析之文本分类3

下面看model的内容,在model中更新参数,也就是输入向量和输出向量。void Model::update(const std::vector& input, int32_t target, real lr) {  assert(target >= 0);//首先确认标签是合法的  assert(target   if (input.size() == 0) return;

2017-09-29 16:47:04 952

原创 词向量源码解析:(6.3)fasttext源码解析之文本分类2

下面我们看看怎么样一步一步进行的文本分类首先看main.cc函数int main(int argc, char** argv) {//处理输入的参数,第一个参数是执行文件本身  if (argc     printUsage();    exit(EXIT_FAILURE);  }  std::string command(argv[1]);//第二个参数高旭fastt

2017-09-29 14:47:25 1348

原创 词向量源码解析:(6.2)fasttext源码解析之文本分类1

我们这个系列是介绍词向量的,怎么这里突然介绍文本向量?实际上fasttext中文本向量就是词向量的平均,得到文本向量并进行分类的代码和word2vec中的CBOW非常像。我们先看一下classification-example.sh。这个脚本文件会对来自于dbpedia的文本进行分类。分类前要对文本进行预处理并且打乱。myshuf() {  perl -MList::Util=shuffl

2017-09-29 14:24:16 1136

原创 词向量源码解析:(6.1)fasttext源码解析

fasttext是word2vec的作者mikolov参与的制作的一个工具包,可以用来训练词向量和进行文本分类。目前已经引起了广泛的关注。这个工具包在github上面的地址是 https://github.com/facebookresearch/fastText 这个项目是C++写的,和之前的项目相比这个项目更加专业,涉及的内容也比之前的项目多很多。所以我们对fasttext的连载也会比较多。

2017-09-29 13:20:47 3756

原创 词向量源码解析:(5.12)ngram2vec源码解析小结

asd

2017-09-28 14:13:52 383

原创 词向量源码解析:(5.11)ngram2vec源码解析之中文analogy数据集

asd

2017-09-28 14:12:20 401

原创 词向量源码解析:(5.10)ngram2vec源码解析之glovef.py

asd

2017-09-28 14:11:33 291

原创 词向量源码解析:(5.9)ngram2vec源码解析之word2vecf.py

asd

2017-09-28 14:10:36 506

原创 词向量源码解析:(5.8)ngram2vec源码解析之counts2ppmi等

我们下面要把共现矩阵加权,得到PPMI矩阵。counts2ppmi这个名字起得不是特别准确,这个文件实际上生成的是PMI矩阵。可能是为了统一,这个工具包把所有应该叫PMI的地方都变成了PPMI。ngram2vec中的counts2ppmi比较合理的利用了scipy中的稀疏矩阵,能很快的从文件中把共现矩阵建立好,然后加权得到PMI矩阵。这里默认要能把所有的三元组读进来,所以可能内存不足。def

2017-09-16 13:15:17 1492

原创 词向量源码解析:(5.7)ngram2vec源码解析之counts2shuf等

GloVe模型需要的是打乱的counts(共现矩阵)。counts2shuf会把counts打乱。此外,目前的GloVe模型接受的是二进制格式的输入。counts2bin的功能就是把python生成的文本格式的共现矩阵变成C语言可以直接读的二进制形式。首先看看counts2shuf。这个和GloVe中的是一模一样的,用python重写了一遍。shuffle的过程分成两个阶段。第一阶段是局部打乱。

2017-09-16 12:55:27 388

原创 词向量源码解析:(5.6)ngram2vec源码解析之pairs2counts

word2vec可以直接在pairs上面进行训练,然而GloVe,PPMI以及SVD都需要在共现矩阵上面进行训练。从pairs得到共现矩阵是非常消耗计算资源的。hyperwords中生成共现矩阵的效率比较低,也没有进度的显示,而且把这个步骤放在了两个文件中(hyperwords中的pairs2counts是没有完全排序的)。GloVe中有一个C语言版本的生成共现矩阵的代码,能很高效的得到共现矩阵。

2017-09-16 10:59:18 690 2

原创 词向量源码解析:(5.5)ngram2vec源码解析之pairs2vocab

之前说过对词向量很重要的一个改进方向就是引入更加丰富的上下文信息。所以中心词和上下文词典是应该不一样的。其实这里中心词也可以引入不同的信息,上下文也可以引入不同的信息。pairs文件中包含了后面所需要的所有信息源,所以我们通过1pairs文件,可以得到中心词和上下文词典。pairs左边的构成中心词词典,右边的构成上下文词典。def main():    args = docopt("""

2017-09-16 00:38:23 425

原创 词向量源码解析:(5.4)ngram2vec源码解析之corpus2pairs

下面我们从语料中抽取出pairs。这个步骤超参很多,比如窗口大小,高频词低频词怎么处理,提取什么样的中心词上下文特征都是在这个步骤中确定的。这个步骤也决定了整个后面模型的信息源。这个过程会调用多线程,因为提取pairs的过程每行之间都是独立的。先看看main函数。主要功能就是开线程,把参数传递给每个线程。def main():    args = docopt("""    Usage

2017-09-15 23:53:50 772

原创 词向量源码解析:(5.3)ngram2vec源码解析之corpus2vocab

在hyperwords工具包中,我们看到了用python几行代码就可以建立一个词典。相对于C用几百行实在是方便太多了。但是hyperwords中建立词典的过程却没有考虑主机的内存情况。建立词典的过程中很容易出现内存不够的情况。在word2vec和GloVe中都有ReduceVocab这样的函数,在建立词典中扔掉一些低频词。这样做的会导致最后的词典不全,但是在实际应用中没有什么问题。word2vec

2017-09-15 13:06:22 768

原创 词向量源码解析:(5.2)ngram2vec源码解析之uni_uni

ngram2vec工具包的流程和hyperwords很像,都是一系列的##2##文件,最终从语料一步一步得到词向量。所以我们先通过脚本文件看一下整个的执行流程。一共有三个脚本文件,uni_uni,uni_bi,bi_bi。这三个脚本都会完整的执行一遍流程,只不过用的特征不一样。_之前表示中心词用的特征,_之后表示上下文用的特征。uni_bi就表示中心词用的是简单的单词特征,上下文用的是单词特征加上

2017-09-15 11:54:53 1349 1

原创 词向量源码解析:(5.1)ngram2vec源码解析

之前一个系列介绍了hyperwords工具包。这个工具包相对于word2vec和GloVe,有了很多新的特性,比如支持任意形式的上下文,比如加入了PPMI这样的稀疏的单词表示。这种稀疏的表示甚至在很多情况下的表现都超过了word2vec和GloVe。当然这个工具包还有不少的问题。首先是在大语料上面会有问题。比如在构建共现矩阵部分效率很低,在大语料上面跑不通。再比如构建词典是代码也没有考虑内存大小等

2017-09-14 19:32:23 4250

原创 词向量源码解析:(4.9)hyperwords源码解析小结

asd

2017-09-13 21:37:21 272 1

原创 词向量源码解析:(4.8)hyperwords源码解析之example_test

我们再看一下example_test.sh脚本,这个脚本能生成多种词向量,包括word2vec,PPMI,SVD在不同超参下面的词向量。流程就是先预处理,然后训练,或是计算出向量,最后用analogy和similarity任务去评估。#!/bin/sh# Download and install word2vecf#下载并且安装word2vecfif [ ! -f word2v

2017-09-13 19:17:43 260

原创 词向量源码解析:(4.7)hyperwords源码解析之text2numpy等

hyperwords中生成的词向量在磁盘上有不同的存储形式,可以用文本形式存,也可以用numpy数组的形式去存。下面说的这几个文件就是对这两种存储形式进行转化的。首先看看text2numpy。这个文件的内容是吧文本形式的词向量转化成numpy数组形式。由于numpy是没有词典信息的,所以还要单独存一个词典。def main():    args = docopt("""    Usag

2017-09-13 19:06:18 220

原创 词向量源码解析:(4.6)hyperwords源码解析之evaluation

hyperwords中包含了两个任务,一个是analogy任务,之前都已经介绍过了,另一个是similarity任务。similarity任务比analogy出现的时间早,是人们能想到的衡量词向量性质的最直接的方式。simialrity衡量词向量性质的过程是:数据集包括了大量的单词对(word pair)以及人对于这个两个单词相似度的打分。我们得到的词向量同样也能对这个单词对的相似度进行打分。我们

2017-09-13 18:13:20 365

原创 词向量源码解析:(4.5)hyperwords源码解析之representations

representations包的主要任务是进一步处理和包装之前模型生成的词向量。这个包中包括了四个文件,下面依次介绍这四个文件。

2017-09-13 15:13:25 300

原创 词向量源码解析:(4.4)hyperwords源码解析之word2vecf

在word2vec代码中只考虑了上下文是单词的情况。已经有大量的论文提出了不同的方式,丰富上下文的信息,从而得到更高质量,或者是性质不同的词向量。word2vecf就是在word2vec上面一个扩展。以前word2vec的输入是语料,现在word2vecf的输入是pair,这样可以支持各种形式的中心词和上下文。比如我们需要引入dependency的信息,我们只需要提供单词文档的pair就好,wor

2017-09-13 13:20:22 594

原创 词向量源码解析:(4.3)hyperwords源码解析之counts2pmi等

PPMI和SVD都是很传统的模型。在word2vec之前很早就出现了。PPMI这种高维稀疏的单词表示一般认为比word2vec要差,尤其是在analogy问题上面。word2vec引起人注意的一个很重要的点就在于在analogy上面远远超过了传统的词向量模型。实际上,这个工具包的作者发现,当我们吧word2vec中的一些超参数引进传统的方法中,并且使用新的公式去做analogy这个任务,PPMI,

2017-09-12 20:03:48 512

原创 词向量源码解析:(4.2)hyperwords源码解析之corpus2pairs等

回想之前在word2vec和GloVe中建立词典以及抽取pair的过程非常的繁琐。比如建立字典需要我们自己去实现dict这样的数据结构。在python中一切都简单的多。构建词典的代码一共只有5行。当然我们用python自带数据结构也有一些弊端,比如这些结构对于我们来说是透明的,不了解的话可能会效率比较低。下面就看一下用python怎么样五行就构建一个词典。输入是语料,输出是词典。def rea

2017-09-12 19:46:12 370 1

原创 词向量源码解析:(4.1)hyperwords源码解析

这个词向量的工具包很值得一读。代码的下载地址是https://bitbucket.org/omerlevy/hyperwords。相对于前面介绍的word2vec和GloVe,这个工具包有以下几个优点:第一点,这个工具包支持任意形式的上下文。word2vec和GloVe中,我们对于上下文的定义就是中心词周围的单词。一个很直接的想法是我们可以往上下文中引入更加丰富的信息,使得我们能够训练更加高质

2017-09-12 15:18:01 673

原创 词向量源码解析:(3.6)GloVe源码解析小结

asd

2017-09-12 12:35:51 461

原创 词向量源码解析:(3.5)GloVe源码解析之glove

和绝大多数的词向量不同,glove的目标是通过训练词向量和上下文向量,使得它们能够重构共现矩阵。glove训练部分的代码风格和word2vec中训练部分的代码风格如出一辙。有了之前看word2vec的基础,很容易就能看懂glove是怎么做的了。glove在三元组上面进行训练。三元组的数据结构依然和原来一样。typedef struct cooccur_rec {    int word1;

2017-09-12 11:58:51 2033 1

原创 词向量源码解析:(3.4)GloVe源码解析之shuffle

这部分代码的功能是打乱共现矩阵中三元组的顺序。cooccur生成的三元组是排好序的。我没有尝试过用排好序的训练能得到什么结果。一个很简单的shuffle方法是把所有的都读入内存,在内存中打乱。但是在我们的内存不足以装下所有的三元组的时候怎么办?这里采用了一个两阶段的方法做shuffle,先局部shuffle,得到很多临时文件。字第二阶段,再均匀的从每个临时文件中读取三元组,放入内存。shuffle

2017-09-12 01:06:33 888

原创 词向量源码解析:(3.2)GloVe源码解析之vocab_count

vocab_count的功能就是生成词典。它的输入是整个语料,它的输出是词典。词典的形式是单词以及单词在语料中出现的次数(频数)。词典是按照频数从高到低排好序的。这部分代码和word2vec中建立词典的代码很像。由于C语言中没有dict这个的现成的数据结构,需要用C语言自己写一个dict。首先看一下GloVe是如何存储单词的typedef struct vocabulary {    ch

2017-09-10 15:39:37 1385

原创 词向量源码解析:(3.1)GloVe源码解析

在word2vec之后又出现了很多词向量模型,其中一个非常流行的模型就是GloVe。GloVe的训练方式和主流的词向量不太一样。主流的词向量模型是像word2vec那样扫一遍语料,一个一个单词的进行训练。换句话说,每个单词和周围的上下文单词组成训练的样本,词向量在这个中心词,上下文单词的对(pair)上面进行训练(比如这样的pair上面进行训练)。但是GloVe不是在pair上面进行训练,而是需要

2017-09-10 14:36:50 2379

原创 词向量源码解析:(2.7)word2vec源码解析小结

asd

2017-09-10 13:56:27 257

原创 词向量源码解析:(2.6)word2vec源码解析之compute-accuracy

asd

2017-09-10 13:54:57 699

原创 词向量源码解析:(2.4)word2vec源码解析之distance

asd

2017-09-09 14:05:32 429

原创 词向量源码解析:(2.3)word2vec源码解析之word2vec

这篇文章分析word2vec.c的源代码。word2vec.c和word2pharse一样都要过两遍语料,第一遍建立字典,这部分的代码两个文件完全是一样的。word2vec.c第二遍过语料就在训练词向量了。word2vec实际上是包含了四种模型,根据对上下文的不同的定义方式,可以分为cbow和sg,根据对上下文和中心单词不同的建模方式,分为负采样和哈夫曼树。所以一组合就有四种模型。负采样英文缩

2017-09-08 21:48:02 723

原创 词向量源码解析:(2.2)word2vec源码解析之word2phrase

我们首先过一遍源码word2phrase.c。这个源码中的很多内容和word2vec.c中的源码是共用的,可以之后方便我们理解word2vec.c。这个代码的的思想很简单,就是希望找出语料中的短语。比如New York这个短语,如果我们把它当做两个单词分开处理显然不合适。这里从语料中找短语的基本思想和和互信息的思想很相似,需要考虑两方面的信息,第一个方面是两个单词,比如New和York,在这个语料

2017-09-08 14:26:41 1757

原创 词向量源码解析:(2.1)word2vec源码解析

首先简单说一下word2vec的使用方式。word2vec的官方下载地址是 https://code.google.com/archive/p/word2vec/ 。到source里面找到download下载就可以。word2vec可以直接在linux上和macos上面运行,但是不能直接在windows上面运行,原因是windows没有pthread库。把pthread依赖去掉可以单线程跑,但是实

2017-08-30 21:34:54 964

原创 词向量源码解析:(1)词向量(词表示)简单介绍

词向量,空间向量模型,源码,word2vec,ngram2vec

2017-08-30 15:57:39 4962

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除