word2vec 订阅
Word2vec,是一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系,该向量为神经网络之隐藏层。 展开全文
Word2vec,是一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系,该向量为神经网络之隐藏层。
信息
外文名
word to vector
领    域
深度学习
定    义
用来产生词向量的相关模型
中文名
Word2vec
依    赖
skip-grams或连续词袋
应    用
自然语言处理
Word2vec简介
随着计算机应用领域的不断扩大,自然语言处理受到了人们的高度重视。机器翻译、语音识别以及信息检索等应用需求对计算机的自然语言处理能力提出了越来越高的要求。为了使计算机能够处理自然语言,首先需要对自然语言进行建模。自然语言建模方法经历了从基于规则的方法到基于统计方法的转变。从基于统计的建模方法得到的自然语言模型称为统计语言模型。有许多统计语言建模技术,包括n-gram、神经网络以及 log_linear 模型等。在对自然语言进行建模的过程中,会出现维数灾难、词语相似性、模型泛化能力以及模型性能等问题。寻找上述问题的解决方案是推动统计语言模型不断发展的内在动力。在对统计语言模型进行研究的背景下,Google 公司在 2013年开放了 Word2vec这一款用于训练词向量的软件工具。Word2vec 可以根据给定的语料库,通过优化后的训练模型快速有效地将一个词语表达成向量形式,为自然语言处理领域的应用研究提供了新的工具。Word2vec依赖skip-grams或连续词袋(CBOW)来建立神经词嵌入。Word2vec为托马斯·米科洛夫(Tomas Mikolov)在Google带领的研究团队创造。 [1]  该算法渐渐被其他人所分析和解释。
收起全文
精华内容
参与话题
问答
  • word2vec的通俗理解

    万次阅读 多人点赞 2018-08-28 23:40:17
    在自然语言处理领域中,本文向量化...1. 向量化算法word2vec 大家很熟悉的词袋(bag of words)模型是最早的以词语为基本处理单元的文本向量化算法,所谓的词袋模型就是借助于词典把文本转化为一组向量,下面是两个简...

    在自然语言处理领域中,本文向量化是文本表示的一种重要方式。在当前阶段,对文本的大部分研究都是通过向量化实现的,但同时也有一部分研究将句子作为文本处理的基本单元,也就是doc2vec和str2vec技术。

    1. word2vec简介

    大家很熟悉的词袋(bag of words)模型是最早的以词语为基本处理单元的文本向量化算法,所谓的词袋模型就是借助于词典把文本转化为一组向量,下面是两个简单的文本示例:

    • john likes to watch movies, mary likes too.
    • john also likes to watch football games.

    现假设词典如下:
    {"john":1,"likes":2,"to":3,"watch":4, "movies":5,"also":6,"football":7,"games":8,"mary":9 "too":10}
    在这个自己构建的词典中,每个单词都有一个唯一的索引,那么上述的两个文本就可以基于这个暂时的词典来构建其文本的向量表示,如下:
    [1,2,1,1,1,0,0,0,0,1,1]
    [1,1,1,1,0,1,1,1,0,0]

    由此可以看出此向量的构建是根据该词在词典出现的次数而构成的,比如第一条文本中的”likes”,这个词在文本中出现了2次,所以基于词袋的文本向量是根据词出现的饿次数构建的。但是此向量与文本中单词出现的顺序没有关系,只是一种频率的表示,该方法容易实现,但是有很大的问题:

    • 维数灾难:假如词典包含10000个单词,那么每个文本需要使用10000维的向量表示,那么向量的很多位置必定是0,如此稀疏的高维向量会严重影响计算速度。
    • 这样构成的向量无法保存词序信息,而词序对于自然语言处理又是那么的重要。
    • 存在语义鸿沟

    例如:关于数据稀疏的问题
    自然语言处理经常把字词转为离散的单独的符号,也就是One-Hot Encoder。

    杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]
    上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]
    宁波 [0,0,0,1,0,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]

    比如上面的这个例子,在语料库中,杭州、上海、宁波、北京各对应一个向量,向量中只有一个值为1,其余都为0。但是使用One-Hot Encoder有以下问题。一方面,城市编码是随机的,向量之间相互独立,看不出城市之间可能存在的关联关系。其次,向量维度的大小取决于语料库中字词的多少。如果将世界所有城市名称对应的向量合为一个矩阵的话,那这个矩阵过于稀疏,并且会造成维度灾难。

    现在随着互联网的发展,大量的无标注数据产生,此时的word2vec技术即是利用神经网络从大量的无标注的文本中提取有用的信息而产生的。

    为什么说word2vec能提取有用的信息呢?
    我们知道词语是表达语义的基本单元,而词袋模型只是简单的将词语符号化,举个不太恰当的比喻就是:现在有”一麻袋”的词语,而我们要处理的文本就像是从一个麻袋中无序得(不分先后顺序)抽出麻袋中所有的词,再查看文本中出现的个数,注意这里的从麻袋中抽取词的过程是无序的,也就是只是简单的统计文本中有没有出现该词和该词出现了几次,所以对于词袋模型,文本的语序特征就丧失了,也就丧失了语义的信息。

    此时我们需要一个模型就是能在使文本向量化的同时也保留了词序的信息。分布式假说的提出就是解决了语义信息的问题。该方法的思想是:上下文相似的词,其语义也相似,随后就有了基于上下文分布表示词义的方法,这就是“词空间模型“。Word2Vec可以将One-Hot Encoder转化为低维度的连续值,也就是稠密向量,并且其中意思相近的词将被映射到向量空间中相近的位置。而使用神经网络可以灵活的对上下文进行建模,也因此成为用的比较多的方法。

    2. 模型简介

    one-hot向量作为word2vec的输入,通过word2vec训练低维词向量(word embedding)
    这里写图片描述
    输入层:One-Hot Vector
    隐藏层:没有激活函数,也就是线性的单元。
    输出层:维度跟输入层的维度一样,用的是Softmax回归。
    我们要获取的dense vector其实就是Hidden Layer的输出单元。有的地方定为Input Layer和Hidden Layer之间的权重,其实说的是一回事。

    下面用具体的例子看下:
    这里写图片描述

    可以看出:
    输入层:5个神经元
    隐藏层:3个神经元
    所以权重矩阵是5x3的大小,可以看出权重矩阵中的[10,12,19]和前向传播后[10,12,19]是一样的。

    3. CBOW模式

    word2vec主要分为CBOW(Continuous Bag of Words)和Skip-Gram两种模式。CBOW是从原始语句推测目标字词;而Skip-Gram正好相反,是从目标字词推测出原始语句。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。

    CBOW模型的理解:
    这里写图片描述
    CBOW模型结构图

    • 输入层:上下文单词的onehot. {假设单词向量空间dim为V,也就是词典的大小。上下文单词个数为C}。
    • 所有onehot分别乘以共享的输入权重矩阵W(V*N矩阵,N为自己设定的数,N也是隐藏层的神经元个数,初始化权重矩阵W)。
    • 所得的向量 {因为是onehot所以为向量} 相加求平均作为隐层向量, size为1*N。
    • 乘以输出权重矩阵W(N*V)。
    • 得到向量 (1*V) ,激活函数处理得到V-dim概率分布,概率最大的index所指示的单词为预测出的中间词(target word)。
    • 与true label的onehot做比较,误差越小越好。

    所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table(其实这个look up table就是矩阵W自身),也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。

    案例:
    这里写图片描述

    5. Skip-Gram模式

    从直观上理解,Skip-Gram是给定input word来预测上下文。

    接下来我们来看看如何训练我们的神经网络。假如我们有一个句子“The dog barked at the mailman”。

    首先我们选句子中间的一个词作为我们的输入词,例如我们选取“dog”作为input word;

    有了input word以后,我们再定义一个叫做skip_window的参数,它代表着我们从当前input word的一侧(左边或右边)选取词的数量。如果我们设置skip_window=2,那么我们最终获得窗口中的词(包括input word在内)就是[‘The’, ‘dog’,’barked’, ‘at’]。skip_window=2代表着选取左input word左侧2个词和右侧2个词进入我们的窗口,所以整个窗口大小span=2x2=4。另一个参数叫num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的output word,当skip_window=2,num_skips=2时,我们将会得到两组 (input word, output word) 形式的训练数据,即 (‘dog’, ‘barked’),(‘dog’, ‘the’)。

    神经网络基于这些训练数据将会输出一个概率分布,这个概率代表着我们的词典中的每个词是output word的可能性。这句话有点绕,我们来看个栗子。第二步中我们在设置skip_window和num_skips=2的情况下获得了两组训练数据。假如我们先拿一组数据 (‘dog’, ‘barked’) 来训练神经网络,那么模型通过学习这个训练样本,会告诉我们词汇表中每个单词是“barked”的概率大小。

    模型的输出概率代表着到我们词典中每个词有多大可能性跟input word同时出现。举个栗子,如果我们向神经网络模型中输入一个单词“中国“,那么最终模型的输出概率中,像“英国”, ”俄罗斯“这种相关词的概率将远高于像”苹果“,”蝈蝈“非相关词的概率。因为”英国“,”俄罗斯“在文本中更大可能在”中国“的窗口中出现。我们将通过给神经网络输入文本中成对的单词来训练它完成上面所说的概率计算。

    面的图中给出了一些我们的训练样本的例子。我们选定句子“The quick brown fox jumps over lazy dog”,设定我们的窗口大小为2(window_size=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。Training Samples(输入, 输出)
    这里写图片描述
    我们的模型将会从每对单词出现的次数中习得统计结果。例如,我们的神经网络可能会得到更多类似(“中国“,”英国“)这样的训练样本对,而对于(”英国“,”蝈蝈“)这样的组合却看到的很少。因此,当我们的模型完成训练后,给定一个单词”中国“作为输入,输出的结果中”英国“或者”俄罗斯“要比”蝈蝈“被赋予更高的概率。

    再次提醒,最终我们需要的是训练出来的权重矩阵。

    5. 训练优化

    此时注意到,这个训练过程的参数规模非常巨大。
    假设语料库中有30000个不同的单词,hidden layer取128,word2vec两个权值矩阵维度都是[30000,128],在使用SGD对庞大的神经网络进行学习时,将是十分缓慢的。而且,你需要大量的训练数据来调整许多权重,避免过度拟合。数以百万计的重量数十亿倍的训练样本意味着训练这个模型将是一个野兽。
    一般来说,有两种加速算法:Hierarchical Softmax、Negative Sampling等方式来解决。

    参考:
    https://blog.csdn.net/mylove0414/article/details/61616617
    https://blog.csdn.net/free356/article/details/79445895

    展开全文
  • 超详细总结之Word2Vec(一)原理推导

    万次阅读 多人点赞 2018-03-18 16:24:17
    本章是介绍Word2Vec的原理推导部分,后面还会有基于TensorFlow的Word2Vec代码实现讲解。 一、什么是Word2Vec? 2013年,Google团队发表了word2vec工具。word2vec工具主要包含两个模型:跳字模型(skip-gram)...

    本章是介绍Word2Vec的原理推导部分,后面还会有基于TensorFlow的Word2Vec代码实现讲解。

    一、什么是Word2Vec?

    2013年,Google团队发表了word2vec工具。word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW),以及两种高效训练的方法:负采样(negative sampling)和层序softmax(hierarchical softmax)。值得一提的是,word2vec词向量可以较好地表达不同词之间的相似和类比关系。

    自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。在机器学习中,如何使用向量表示词?顾名思义,词向量是用来表示词的向量,通常也被认为是词的特征向量。近年来,词向量已逐渐成为自然语言处理的基础知识。

    NLP(自然语言处理)里面,最细粒度的是 词语,词语组成句子,句子再组成段落、篇章、文档。所以处理 NLP 的问题,首先就要拿词语开刀。词语,是人类的抽象总结,是符号形式的(比如中文、英文、拉丁文等等),所以需要把他们转换成数值形式,或者说——嵌入到一个数学空间里,这种嵌入方式,就叫词嵌入(word embedding),而 Word2vec,就是词嵌入( word embedding) 的一种。简单点来说就是把一个词语转换成对应向量的表达形式,来让机器读取数据。
    #二、语言模型 Language Model
    在深入word2vec算法的细节之前,我们首先回顾一下自然语言处理中的一个基本问题:如何计算一段文本序列在某种语言下出现的概率?之所为称其为一个基本问题,是因为它在很多NLP任务中都扮演着重要的角色。例如,在机器翻译的问题中,如果我们知道了目标语言中每句话的概率,就可以从候选集合中挑选出最合理的句子做为翻译结果返回。

    统计语言模型给出了这一类问题的一个基本解决框架。对于一段文本序列S=w1,w2,…,wT,它的概率可以表示为:
    p(S)=p(w1,w2,w3,w4,w5,…,wt)
    =p(w1)p(w2|w1)p(w3|w1,w2)…p(wt|w1,w2,…,wt-1)
    即将序列的联合概率转化为一系列条件概率的乘积。问题变成了如何去预测这些给定previous words下的条件概率p(wt|w1,w2,…,wt−1)。常见的统计语言模型有N元文法模型(N-gram Model)

    基于马尔科夫假设(Markov Assumption):下一个词的出现仅依赖于它前面的一个或几个词。
    假设下一个词的出现依赖它前面的一个词,则有:
    p(S)=p(w1)p(w2|w1)p(w3|w1,w2)…p(wn|w1,w2,…,wn-1)
    =p(w1)p(w2|w1)p(w3|w2)…p(wn|wn-1) // bigram
    假设下一个词的出现依赖它前面的两个词,则有:
    p(S)=p(w1)p(w2|w1)p(w3|w1,w2)…p(wn|w1,w2,…,wn-1)
    =p(w1)p(w2|w1)p(w3|w1,w2)…p(wn|wn-1,wn-2) // trigram

    那么,我们在面临实际问题时,如何选择依赖词的个数,即n。

    更大的n:对下一个词出现的约束信息更多,具有更大的辨别力;
    更小的n:在训练语料库中出现的次数更多,具有更可靠的统计信息,具有更高的可靠性。
    理论上,n越大越好,经验上,trigram用的最多,尽管如此,原则上,能用bigram解决,绝不使用trigram。

    #三、NLP词的表示方法类型
    ##1、词的独热表示one-hot
    用词向量来表示词并不是word2vec的首创,在很久之前就出现了。最早的词向量是很冗长的,它使用是词向量维度大小为整个词汇表的大小,对于每个具体的词汇表中的词,将对应的位置置为1。比如我们有5个词组成的词汇表,词"Queen"在词汇表中的序号为2, 那么它的词向量就是(0,1,0,0,0)。同样的道理,词"Woman"是序号3,词向量就是(0,0,1,0,0)。这种词向量的编码方式我们一般叫做one hot representation.

    One hot representation用来表示词向量非常简单,但是却有很多问题。1、任意两个词之间都是孤立的,根本无法表示出在语义层面上词语词之间的相关信息,而这一点是致命的。2、我们的词汇表一般都非常大,比如达到百万级别,这样每个词都用百万维的向量来表示简直是内存的灾难。能不能把词向量的维度变小呢?
    ##2、词的分布式表示 distributed representation
    Dristributed representation可以解决One hot representation的问题,它的思路是通过训练,将每个词都映射到一个较短的词向量上来。所有的这些词向量就构成了向量空间,进而可以用普通的统计学的方法来研究词与词之间的关系。这个较短的词向量维度是多大呢?这个一般需要我们在训练时自己来指定。
    词的分布式表示主要可以分为三类:基于矩阵的分布表示、基于聚类的分布表示和基于神经网络的分布表示
    #四、基于神经网络的分布表示,词向量( word embedding)
    ##1、概念
    基于神经网络的分布表示又称为词向量或者词嵌入。 2001年, Bengio 等人正式提出神经网络语言模型( Neural Network Language Model ,NNLM),该模型在学习语言模型的同时,也得到了词向量。所以请注意一点:词向量可以认为是神经网络训练语言模型的副产品。

    2.神经网络语言模型

    上面说,通过神经网络训练语言模型可以得到词向量,那么,究竟有哪些类型的神经网络语言模型呢?个人所知,大致有这么些:
    a) Neural Network Language Model ,NNLM
    b) Log-Bilinear Language Model, LBL
    c) Recurrent Neural Network based Language Model,RNNLM
    d) Collobert 和 Weston 在2008 年提出的 C&W 模型
    e) Mikolov 等人提出了 CBOW( Continuous Bagof-Words)和 Skip-gram 模型
    如今我们主要用到的是CBOW和Skip-gram模型。

    **好了,不少初学者看到这里会思维混乱,到这里我们来梳理一下思路。要想得到一个词的向量表达方法,并且这个向量的维度很小,而且任意两个词之间是有联系的,可以表示出在语义层面上词语词之间的相关信息。我们就需要训练神经网络语言模型,即CBOW和Skip-gram模型。这个模型的输出我们不关心,我们关心的是模型中第一个隐含层中的参数权重,这个参数矩阵就是我们需要的词向量。**它的每一行就是词典中对应词的词向量,行数就是词典的大小。
    下面就要介绍CBOW和Skip-gram模型。
    ##3. CBOW
    CBOW(Continuous Bag-of-Word Model)又称连续词袋模型,是一个三层神经网络。如下图所示,该模型的特点是输入已知上下文,输出对当前单词的预测。
    这里写图片描述

    其学习目标是最大化对数似然函数:

    这里写图片描述

    其中,w表示语料库C中任意一个词。
    下面上一个更细节的一个图:
    在这里插入图片描述
    公式咱们就不放了,网络计算的步骤:

    • 输入层:上下文单词的onehot。(假设单词向量空间dim为V,上下文单词个数为C)
    • 所有onehot分别乘以共享的输入权重矩阵W(V*N矩阵,N为自己设定的数,初始化权重矩阵W)
    • 所得的向量 (注意onehot向量乘以矩阵的结果) 相加求平均作为隐层向量, size为1*N.
    • 乘以输出权重矩阵W’ {N*V}
    • 得到向量 {1*V} 激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维斗代表着一个单词},概率最大的index所指示的单词为预测出的中间词(target word)
    • 与true label的onehot做比较,误差越小越好。loss function(一般为交叉熵代价函数)

    我们并不关心输出的内容,预测的结果不重要,重要的是训练完成后第一个全连接层的参数就是我们要的word embedding矩阵。
    ##4.Skip-gram
    Skip-gram只是逆转了CBOW的因果关系而已,即已知当前词语,预测上下文。
    这里写图片描述
    #五、训练注意事项
    在第一部分讲解完成后,我们会发现Word2Vec模型是一个超级大的神经网络(权重矩阵规模非常大)。

    举个栗子,我们拥有10000个单词的词汇表,我们如果想嵌入300维的词向量,那么我们的输入-隐层权重矩阵和隐层-输出层的权重矩阵都会有 10000 x 300 = 300万个权重,在如此庞大的神经网络中进行梯度下降是相当慢的。更糟糕的是,你需要大量的训练数据来调整这些权重并且避免过拟合。百万数量级的权重矩阵和亿万数量级的训练样本意味着训练这个模型将会是个灾难(太凶残了)。
    下面主要介绍两种方法优化训练过程。

    1.负采样(negative sampling)
    负采样(negative sampling)解决了这个问题,它是用来提高训练速度并且改善所得到词向量的质量的一种方法。不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。至于具体的细节我在这里就不在介绍了
    2.层序softmax也是解决这个问题的一种方法。这里也不做详细介绍。
    #六、总结
    最后强调一下,word2vec一个NLP工具,它可以将所有的词向量化,这样词与词之间就可以定量的去度量他们之间的关系,挖掘词之间的联系。word2vec主要包含两个模型Skip-gram和CBOW。以及两种高效的训练方法负采样,层序softmax。
    关于Word2Vec的详细介绍终于结束了,相信看完本文章你会理解Word2Vec的来龙去脉。下面读者可以查看下面的章节用TensorFlow来实现Word2Vec。

    参考文献:
    http://zh.gluon.ai/chapter_natural-language-processing/word2vec.html
    https://www.zhihu.com/search?type=content&q=CBOW

    展开全文
  • 自然语言处理Word2Vec视频学习教程

    万人学习 2017-06-21 22:39:12
    自然语言处理Word2Vec视频培训课程:自然语言处理中重要的算法,word2vec原理,词向量模型。教程从语言模型入手,详解词向量构造原理与求解算法。理论与实战结合,使用深度学习框架Tensorflow从零开始打造word2vec词...
  • 小白都能理解的通俗易懂word2vec详解

    万次阅读 多人点赞 2018-09-01 23:29:21
    自从Mikolov在他2013年的论文“Efficient Estimation of Word Representation in Vector Space”提出词向量的概念后,NLP领域仿佛一下子进入了embedding的世界,Sentence2Vec、Doc2Vec、Everything2Vec。词向量基于...

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
    欢迎大家star,留言,一起学习进步

    前言

    自从Mikolov在他2013年的论文“Efficient Estimation of Word Representation in Vector Space”提出词向量的概念后,NLP领域仿佛一下子进入了embedding的世界,Sentence2Vec、Doc2Vec、Everything2Vec。词向量基于语言模型的假设——“一个词的含义可以由它的上下文推断得出“,提出了词的Distributed Representation表示方法。相较于传统NLP的高维、稀疏的表示法(One-hot Representation),Word2Vec训练出的词向量是低维、稠密的。Word2Vec利用了词的上下文信息,语义信息更加丰富,目前常见的应用有:

    1. 使用训练出的词向量作为输入特征,提升现有系统,如应用在情感分析、词性标注、语言翻译等神经网络中的输入层。
    2. 直接从语言学的角度对词向量进行应用,如使用向量的距离表示词语相似度、query相关性等。
      注:前言部分内容来自参考文献1。

    1.什么是word2vec

    如果用一句比较简单的话来总结,word2vec是用一个一层的神经网络(即CBOW)把one-hot形式的稀疏词向量映射称为一个n维(n一般为几百)的稠密向量的过程。为了加快模型训练速度,其中的tricks包括Hierarchical softmax,negative sampling, Huffman Tree等。

    在NLP中,最细粒度的对象是词语。如果我们要进行词性标注,用一般的思路,我们可以有一系列的样本数据(x,y)。其中x表示词语,y表示词性。而我们要做的,就是找到一个x -> y的映射关系,传统的方法包括Bayes,SVM等算法。但是我们的数学模型,一般都是数值型的输入。但是NLP中的词语,是人类的抽象总结,是符号形式的(比如中文、英文、拉丁文等等),所以需要把他们转换成数值形式,或者说——嵌入到一个数学空间里,这种嵌入方式,就叫词嵌入(word embedding),而 Word2vec,就是词嵌入( word embedding) 的一种。

    在 NLP 中,把 x 看做一个句子里的一个词语,y 是这个词语的上下文词语,那么这里的 f,便是 NLP 中经常出现的『语言模型』(language model),这个模型的目的,就是判断 (x,y) 这个样本,是否符合自然语言的法则,更通俗点说就是:词语x和词语y放在一起,是不是人话。

    Word2vec 正是来源于这个思想,但它的最终目的,不是要把 f 训练得多么完美,而是只关心模型训练完后的副产物——模型参数(这里特指神经网络的权重),并将这些参数,作为输入 x 的某种向量化的表示,这个向量便叫做——词向量。
    (上面部分内容来自参考文献2)

    2.CBOW与Skip-Gram

    word2vec里面有两个重要的模型-CBOW模型(Continuous Bag-of-Words Model)与Skip-gram模型。在Tomas Mikolov的paper中给出了示意图。

    这里写图片描述

    由名字与图都很容易看出来,CBOW就是根据某个词前面的C个词或者前后C个连续的词,来计算某个词出现的概率。Skip-Gram Model相反,是根据某个词,然后分别计算它前后出现某几个词的各个概率。

    上一张图,可以比较清楚地看清楚CBOW的训练过程。
    这里写图片描述
    (图片来自网络)

    把这张图看懂,基本word2vec就懂了一大半。下面来详细说说这张图。
    词向量最简单的方式是1-of-N的one-hot方式。onehot对于同学们来说都很熟悉了,也就是从很大的词库corpus里选V个频率最高的词(忽略其他的) ,V一般比较大,比如V=10W,固定这些词的顺序,然后每个词就可以用一个V维的稀疏向量表示了,这个向量只有一个位置的元素是1,其他位置的元素都是0。One hot方式其实就是简单的直接映射,所以缺点也很明显,维数很大,也没啥计算上的意义。
    在上图中,
    1、Input layer输出层:是上下文单词的one hot。假设单词向量空间的维度为V,即整个词库corpus大小为V,上下文单词窗口的大小为C。
    2、假设最终词向量的维度大小为N,则图中的权值共享矩阵为W。W的大小为 VNV * N,并且初始化。
    3、假设语料中有一句话"我爱你"。如果我们现在关注"爱"这个词,令C=2,则其上下文为"我",“你”。模型把"我" "你"的onehot形式作为输入。易知其大小为1V1*V。C个1*V大小的向量分别跟同一个VNV * N大小的权值共享矩阵W相乘,得到的是C个1N1*N大小的隐层hidden layer。
    4.C个1N1*N大小的hidden layer取平均,得到一个1N1*N大小的向量,即图中的Hidden layer。
    5.输出权重矩阵W’为NVN*V,并进行相应的初始化工作。
    6.将得到的Hidden layer向量 1N1*N与W’相乘,并且用softmax处理,得到1V1*V的向量,此向量的每一维代表corpus中的一个单词。概率中最大的index所代表的单词为预测出的中间词。
    7.与groud truth中的one hot比较,求loss function的的极小值。

    具体计算过程为:
    从input -> hidden: WTxW^T * x, W为V*N矩阵,x为V * 1向量,最终隐层的结果为 N * 1
    从hidden -> output: xTWx^T * W^{'},其中x为N1N * 1向量,WW^{'}为V * N,最终结果为1V1 * V

    3.word2vec其实不关注模型

    word2vec可以分为两部分:模型与通过模型获得的词向量。
    word2vec的思路与自编码器(auto-encoder)的思路比较相似。都是先基于训练数据构建一个神经网络。当这个网络训练好一有,我们并不会利用这个训练好的网络处理新任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如隐层的权重矩阵——后面我们将会看到这些权重在Word2Vec中实际上就是我们试图去学习的“word vectors”。基于训练数据建模的过程,我们给它一个名字叫“Fake Task”,意味着建模并不是我们最终的目的。

    上面提到的这种方法实际上会在无监督特征学习(unsupervised feature learning)中见到,最常见的就是自编码器(auto-encoder):通过在隐层将输入进行编码压缩,继而在输出层将数据解码恢复初始状态,训练完成后,我们会将输出层“砍掉”,仅保留隐层。

    4.tricks

    1.hierarchical softmax
    最后预测输出向量时候,大小是1*V的向量,本质上是个多分类的问题。通过hierarchical softmax的技巧,把V分类的问题变成了log(V)次二分类。

    2.negative sampling
    本质上是对训练集进行了采样,从而减小了训练集的大小。
    每个词𝑤的概率由下式决定
    len(w)=count(w)3/4uvocabcount(u)3/4len(w) = \frac{count(w)^{3/4}}{\sum\limits_{u \in vocab} count(u)^{3/4}}

    参考文献:
    1.https://zhuanlan.zhihu.com/p/28491088
    2.https://zhuanlan.zhihu.com/p/26306795
    3.http://alwa.info/2016/04/24/Autoencoder-%E8%AF%A6%E8%A7%A3/
    4.https://qrfaction.github.io/2018/03/20/%E6%95%B0%E6%8D%AE%E7%AB%9E%E8%B5%9Btrick%E6%80%BB%E7%BB%93/ 数据竞赛trick总结

    展开全文
  • word2vec训练中文词向量

    万次阅读 多人点赞 2018-09-26 16:27:45
    词向量作为文本的基本结构——词的模型。良好的词向量可以达到语义相近的词在词向量空间里聚集在一起,这对后续的文本分类,文本聚类等等操作提供了便利,这里简单介绍词向量的训练,主要是记录学习模型和词向量的...

    词向量作为文本的基本结构——词的模型。良好的词向量可以达到语义相近的词在词向量空间里聚集在一起,这对后续的文本分类,文本聚类等等操作提供了便利,这里简单介绍词向量的训练,主要是记录学习模型和词向量的保存及一些函数用法。

    一、搜狐新闻

    1. 中文语料库准备

    本文采用的是搜狗实验室的搜狗新闻语料库,数据链接 http://www.sogou.com/labs/resource/cs.php

    下载下来的文件名为: news_sohusite_xml.full.tar.gz

    2. 数据预处理

    2.1 数据解压缩并取出内容

    (1)cd 到原始文件目录下,执行解压命令:

    tar -zvxf news_sohusite_xml.full.tar.gz
    

    (2)取出内容

    由于这里的搜狐的材料中每个 对中存储的是文本内容。
    所以取出 中的内容,执行如下命令:

    cat news_tensite_xml.dat | iconv -f gbk -t utf-8 -c | grep "<content>"  > corpus.txt
    

    得到文件名为corpus.txt的文件,可以通过vim 打开

    vim corpus.txt
    
    2.2 使用jieba分词

    送给word2vec的文件是需要分词的,分词可以采用jieba分词实现,jieba安装很简单,这里不再讲解。
    分词的代码如下:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Tue Sep 11 18:46:22 2018
    @author: lilong
    """
    
    
    
    """
    由原始文本进行分词后保存到新的文件
    """
    import jieba
    import numpy as np
    
    filePath='corpus_1.txt'
    fileSegWordDonePath ='corpusSegDone_1.txt'
    
    # 打印中文列表
    def PrintListChinese(list):
        for i in range(len(list)):
            print (list[i]) 
                    
    # 读取文件内容到列表
    fileTrainRead = []
    with open(filePath,'r') as fileTrainRaw:
        for line in fileTrainRaw:  # 按行读取文件
            fileTrainRead.append(line)
        
    
    # jieba分词后保存在列表中
    fileTrainSeg=[]
    for i in range(len(fileTrainRead)):
        fileTrainSeg.append([' '.join(list(jieba.cut(fileTrainRead[i][9:-11],cut_all=False)))])
        if i % 100 == 0:
            print(i)
            
    
    # 保存分词结果到文件中
    with open(fileSegWordDonePath,'w',encoding='utf-8') as fW:
        for i in range(len(fileTrainSeg)):
            fW.write(fileTrainSeg[i][0])
            fW.write('\n')
          
           
    
    """
    gensim word2vec获取词向量
    """
    
    import warnings
    import logging
    import os.path
    import sys
    import multiprocessing
    
    import gensim
    from gensim.models import Word2Vec
    from gensim.models.word2vec import LineSentence
    # 忽略警告
    warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')
     
    if __name__ == '__main__':
        
        program = os.path.basename(sys.argv[0]) # 读取当前文件的文件名
        logger = logging.getLogger(program)
        logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s',level=logging.INFO)
        logger.info("running %s" % ' '.join(sys.argv))
     
        # inp为输入语料, outp1为输出模型, outp2为vector格式的模型
        inp = 'corpusSegDone_1.txt'
        out_model = 'corpusSegDone_1.model'
        out_vector = 'corpusSegDone_1.vector'
     
        # 训练skip-gram模型
        model = Word2Vec(LineSentence(inp), size=50, window=5, min_count=5,
                         workers=multiprocessing.cpu_count())
     
        # 保存模型
        model.save(out_model)
        # 保存词向量
        model.wv.save_word2vec_format(out_vector, binary=False)
    

    分词的结果是:
    在这里插入图片描述

    并且会保存3个文件:
    corpusSegDone_1.txt
    corpusSegDone_1.model
    corpusSegDone_1.vector

    由于这里运行需要一段时间,所以没有进行验证测试。

    二、维基百科

    由于训练需要一定的时间,所以这里只讲下思路。

    1. 数据预处理

    维基百科数据量不够大,百度百科数据量较全面,内容上面百度百科大陆相关的信息比较全面,港澳台和国外相关信息维基百科的内容比较详细,因此训练时将两个语料一起投入训练,形成互补,另外还加入了1.1万公司行业数据

    模型:gensim工具包word2vec模型,安装使用简单,训练速度快
    语料:百度百科500万词条+维基百科30万词条+1.1万条领域数据
    分词:jieba分词,自定义词典加入行业词,去除停用词
    硬件:根据自己的电脑硬件而定

    2. 分词

    1. 准备一个停用词词典,训练时要去除停用词的干扰
    2. 分词工具有中科院分词,哈工大的LTP分词,jieba分词,分词效果中科院的分词效果不错,而这里直接使用jieba进行分词,使用简单方便,分词速度快。
    3. 自定义词典:由于百科数据有很多专属名词,很多比较长,如果直接分词,很大情况下会被切开,这不是我们想要的结果,比如:中国人民解放军,可能会被分成:中国 人民 解放军,jieba虽然有新词发现功能,为保证分词准确度,jieba的作者建议我们还是使用自定义词典。
    4. 自定义词典抽取:从百度百科抽取了200万的词条,由于自定义词典包含英文单词时会导致jieba对英文单词进行分词,所以需要用正则表达式去除词条中的英文数据,并且去除一些单字词,还有一些词条里面较短词,如"在北京",这类词会导致分词出现问题,也需要使用正则去除,也有简单粗暴的方法,直接保留3个汉字及以上的中文词条,去除之后得到170万大小的自定义词典。
    5. 分词

    分词代码:

    # 多线程分词
    # jieba.enable_parallel()
    
    #加载自定义词典
    jieba.load_userdict("F:/baike_spider/dict/baike_word_chinese")
    
    #加载停用词
    def getStopwords():
        stopwords = []
        with open("stop_words.txt", "r", encoding='utf8') as f:
            lines = f.readlines()
            for line in lines:
                stopwords.append(line.strip())
        return stopwords
    
    #分词
    def segment():
        file_nums = 0
        count = 0
        url = base_url + 'processed_data/demo/'
        fileNames = os.listdir(url)
        for file in fileNames: # 遍历每个文件
            # 日志信息
            logging.info('starting ' + str(file_nums) + 'file word Segmentation')
            segment_file = open(url + file + '_segment', 'a', encoding='utf8')
            # 每个文件单独处理
            with open(url + file, encoding='utf8') as f:
                text = f.readlines()
                for sentence in text:
                    sentence = list(jieba.cut(sentence))
                    sentence_segment = []
                    for word in sentence:
                        if word not in stopwords:
                            sentence_segment.append(word)
                    segment_file.write(" ".join(sentence_segment))
                del text
                f.close()
            segment_file.close()
            # 日志信息
            logging.info('finished ' + str(file_nums) + 'file word Segmentation')
            file_nums += 1
    
    
    • 由于python多线程只能单核多线程,如果是多核的机器并不能有效使用cpu,jieba是使用python写的,所以jieba只支持并行分词,并行分词指的是多进程分词,并且不支持windows。
    • 在linux试过jieba自带的并行分词,开启并行分词之后,jieba后台会自动开启多个进程,并且并行分词需要一次性将训练语料读取到内存并传入jieba.cut(file.read())中才会有效果,如果类似我代码中逐行传入,开启多进程是不起作用的,jieba多进程原理是,jieba后台会自动将语料切分分配给指定进程处理,分好词后再合并。
    • 8核16g内存Linux虚拟机,发现开启jieba并行分词,1g的语料数据,很快就爆内存了
    • 单进程的jieba分词,不需要一次性加载所有语料数据,可逐行读取语料,内存占用不大,运行稳定。因此将语料数据分成8份,手动开启8个进程分别分词,这样每个进程内存占用都很稳定,比jieba自带的并行分词性能好,20g的数据,开启HMM模式,分词大概花了10个小时

    3. word2vec训练

    使用gensim工具包的word2vec训练,使用简单速度快,效果比Google 的word2vec效果好,用tensorflow来跑word2vec模型,16g的内存根本跑不动
    gensim word2vec 训练代码如下,非常简单:

    import logging
    import multiprocessing
    import os.path
    import sys
    import jieba
    
    from gensim.models import Word2Vec
    from gensim.models.word2vec import PathLineSentences
    
    if __name__ == '__main__':
        
        # 日志信息输出
        program = os.path.basename(sys.argv[0])
        logger = logging.getLogger(program)
        logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
        logging.root.setLevel(level=logging.INFO)
        logger.info("running %s" % ' '.join(sys.argv))
        
        # check and process input arguments
        # if len(sys.argv) < 4:
        #     print(globals()['__doc__'] % locals())
        #     sys.exit(1)
        # input_dir, outp1, outp2 = sys.argv[1:4]
        
        input_dir = 'segment'
        outp1 = 'baike.model'
        outp2 = 'word2vec_format'
        fileNames = os.listdir(input_dir)
        # 训练模型 
        # 输入语料目录:PathLineSentences(input_dir)
        # embedding size:256 共现窗口大小:10 去除出现次数5以下的词,多线程运行,迭代10次
        model = Word2Vec(PathLineSentences(input_dir),
                         size=256, window=10, min_count=5,
                         workers=multiprocessing.cpu_count(), iter=10)
        model.save(outp1)
        model.wv.save_word2vec_format(outp2, binary=False)
    
        # 运行命令:输入训练文件目录 python word2vec_model.py data baike.model baike.vector
    
    
    • 由于语料太大,不能一次性加载到内存训练,gensim提供了PathLineSentences(input_dir)这个类,会去指定目录依次读取语料数据文件,采用iterator方式加载训练数据到内存。
    • 从训练日志可以看到,其过程是先依次读取每个文件,生成总的vocab词典,用来统计count,训练时用来过滤min_count小于我们制定数量的词,vocab总词典生成后,会依次读入语料进行model训练,训练速度非常快。

    三、word2vec词向量的保存与加载

    1. 以model.save()方法保存词向量
      保存词向量
    import gensim
    model = gensim.models.Word2Vec(documents, size=300)
    model.train(documents, total_examples=len(documents), epochs=10)
    model.save("../input/Word2vec.w2v")
    

    加载词向量

    import gensim
    word2vec = gensim.models.word2vec.Word2Vec.load("./input/Quora.w2v").wv
    
    1. 存为二进制的词向量

    保存词向量

    model.wv.save_Word2Vec_format(embedding_path,binary=True)
    #model.wv.save_Word2Vec_format(embedding_path,binary=False)非二进制
    

    加载词向量

    import gensim
    word2vec = gensim.models.KeyedVectors.load_word2vec_format(embedding_path,binary=True)
    
    1. 使用numpy进行保存和加载

    保存数组数据的文件可以是二进制格式或者文本格式,二进制格式的文件可以是Numpy专用的二进制类型和无格式类型。

    使用np.save()保存npy文件,np.load()加载npy文件。

    模型导出与导入:

    最简单的导入与导出

    (1)word2vec.save即可导出文件,这边没有导出为.bin

    # 模型保存与载入
    model.save('/tmp/mymodel')
    new_model = gensim.models.Word2Vec.load('/tmp/mymodel')
    odel = Word2Vec.load_word2vec_format('/tmp/vectors.txt', binary=False)  # 载入 .txt文件
    # using gzipped/bz2 input works too, no need to unzip:
    model = Word2Vec.load_word2vec_format('/tmp/vectors.bin.gz', binary=True)  # 载入 .bin文件
    
    word2vec = gensim.models.word2vec.Word2Vec(sentences(), size=256, window=10, min_count=64, sg=1, hs=1, iter=10, workers=25)
    word2vec.save('word2vec_wx')
    
    

    (2)gensim.models.Word2Vec.load的办法导入

    model = gensim.models.Word2Vec.load('xxx/word2vec_wx')
    pd.Series(model.most_similar(u'微信',topn = 360000))
    

    (3)Numpy的话可以用numpy.load:

    import numpy
    word_2x = numpy.load('xxx/word2vec_wx.wv.syn0.npy')
    

    (4)其他的导入方式,导入txt格式+bin格式 :

    from gensim.models.keyedvectors import KeyedVectors
    word_vectors = KeyedVectors.load_word2vec_format('/tmp/vectors.txt', binary=False)  # C text format
    word_vectors = KeyedVectors.load_word2vec_format('/tmp/vectors.bin', binary=True)  # C binary format
    

    增量训练

    # 增量训练
    model = gensim.models.Word2Vec.load(temp_path)
    more_sentences = [['Advanced', 'users', 'can', 'load', 'a', 'model', 'and', 'continue', 'training', 'it', 'with', 'more', 'sentences']]
    model.build_vocab(more_sentences, update=True)
    model.train(more_sentences, total_examples=model.corpus_count, epochs=model.iter)
     
    

    不能对C生成的模型进行再训练

    仅用做记录学习。

    参考:
    https://www.cnblogs.com/Newsteinwell/p/6034747.html
    https://www.jianshu.com/p/87798bccee48
    https://blog.csdn.net/sinat_26917383/article/details/69803018

    展开全文
  • word2vec

    2019-08-21 16:53:13
    词袋模型是一种用向量表示句子的方法,像这样把一段文本转换成数值形式,就称为词嵌入(word embedding),除了词袋模型之外还有很多方法可以对文本进行转换,现在就来介绍另外一种非常著名的方法word2vec。...
  • Word2Vec解释

    万次阅读 2018-04-17 15:46:51
    Word2Vec解释 一、Word2Vec梗概 字面意思:即Word to Vector,由词到向量的方法。 专业解释:Word2Vec使用一层神经网络将one-hot(独热编码)形式的词向量映射到分布式形式的词向量。使用了Hierarchical ...
  • python︱gensim训练word2vec及相关函数与功能理解

    万次阅读 多人点赞 2017-04-09 11:23:56
    一、gensim介绍 gensim是一款强大的自然语言处理工具,里面包括N...- word2vec、paragraph2vec . 二、训练模型 1、训练 最简单的训练方式: # 最简单的开始 import gensim sent...
  • Word2Vec

    千次阅读 2015-10-27 22:47:45
    Word2Vec Word2Vec是将词表示为实数值向量的工具,并将对文本内容的处理转换为K维向量空间的向量运算。Word2Vec输出的词向量可以用来做NLP相关的工作,比如聚类、同义词、词性分析等。 1.向量空间上的相似度可以用来...
  • gensim Word2Vec 训练和使用

    万次阅读 多人点赞 2018-01-26 11:44:30
    利用gensim.models.Word2Vec(sentences)建立词向量模型 该构造函数执行了三个步骤:建立一个空的模型对象,遍历一次语料库建立词典,第二次遍历语料库建立神经网络模型。可以通过分别执行model=gensim.models.Word...
  • Word Embedding与Word2Vec

    万次阅读 多人点赞 2017-09-05 02:39:43
    随着深度学习的兴起,研究人员开始设计基于神经网络的词嵌入方法,其中最为重要,也是当前最流行的Word Embedding方法就是Tomas Mikolov在谷歌工作时发明的Word2Vec方法,同时谷歌还开源了Word2Vec这个工具箱的源码...
  • word2vec 中的数学原理详解(一)目录和前言

    万次阅读 多人点赞 2014-07-19 22:42:50
    word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单、高效,因此引起了很多人的关注。由于 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而...
  • 图解Word2vec

    千次阅读 2019-04-08 08:58:57
    作者: 龙心尘 时间:2019年4月 ...审校:龙心尘 作者:Jay Alammar 编译:张秋玥、毅航、高延 嵌入(embedding)是机器学习中最迷人的想法之一。 如果你曾经使用Siri、Google Assistant、Alexa、Google翻译,甚至智能...
  • word2vec以及GloVe总结

    万次阅读 2017-12-31 12:46:55
    词向量词向量,顾名思义,就是把一个单词或词语表示成一个向量的形式,这是因为在计算机中无法直接处理自然语言,需要把它转化为机器能够理解的语言,比如数值等。最简单的方式是把一个个单词表示成one-hot的形式。...
  • NLP之word2vecword2vec简介、安装、使用方法之详细攻略 目录 word2vec简介 1、稀疏向量One-Hot Encoder 2、密集向量distributed representation 3、word2vec的两大语言模型 word2vec安装 word2vec使用...
  • word2vec源码详解

    千次阅读 2018-05-09 12:00:11
  • word2vec的应用----使用gensim来训练模型

    万次阅读 多人点赞 2018-01-18 17:45:56
    一、word2vec的原理就不介绍 原理可以参考码农场介绍:http://www.hankcs.com/nlp/word-vector-representations-word2vec.html 二、 gensim的介绍与使用 1. gensim安装 gensim是一个很好用的Python NLP的包,...
  • 词语向量化-word2vec简介和使用

    万次阅读 2017-06-09 02:39:47
    前言最初听闻word2vec还在读研了。当时挺感兴趣的,不过一直忙于毕业事项,没好好研究下,对word2vec也只是概念上的了解,直到这两天有空才能专门学习下这方面的知识。知识不经过整理很容易忘记,尤其像这种算法类的...
  • Word2vec原理浅析及gensim中word2vec使用

    千次阅读 2019-05-19 17:53:22
    本文转载于以下博客链接:Word2vec原理浅析:https://blog.csdn.net/u010700066/article/details/83070102; gensim中word2vec使用:https://www.jianshu.com/p/b779f8219f74 ...Word2Vec是由Google的M...
  • word2vec词向量中文语料处理(python gensim word2vec总结)

    万次阅读 热门讨论 2018-12-21 15:41:45
    目录 中文语料处理 法一:语料处理为列表 ...class : gensim.models.word2vec.PathLineSentences 对于单个文件语料,使用LineSentence 语料库获取语料 word2vec中文语料处理及模型训练实践 python gensi...
  • 如何通俗理解word2vec

    千次阅读 多人点赞 2019-10-23 18:38:28
    如何通俗理解word2vec 前言 今年上半年,我在我的上一篇LSTM博客中写道:“众所周知,我们已经把SVM、CNN、xgboost、LSTM等很多技术,写的/讲的国内最通俗易懂了,接下来,我们要把BERT等技术也写的/讲的国内最...
  • 使用gensim训练中文语料word2vec

    千次阅读 2018-11-14 19:18:02
    使用gensim训练中文语料word2vec 目录 使用gensim训练中文语料word2vec 1、项目目录结构 1.1 文件说明: 1.2 项目下载地址 2、使用jieba中文切词工具进行切词 2.1 添加自定义词典 2.2 添加停用词 2.3 ...
  • 机器学习算法实现解析——word2vec源码解析

    万次阅读 多人点赞 2017-03-16 16:32:44
    在阅读本文之前,建议首先阅读“简单易学的机器学习算法——word2vec的算法原理”,掌握如下的几个概念: 什么是统计语言模型 神经概率语言模型的网络结构 CBOW模型和Skip-gram模型的网络结构 Hierarchical Softmax...
  • 自己动手写word2vec (一):主要概念和流程

    万次阅读 多人点赞 2016-07-11 22:35:14
    word2vec 是 Google 于 2013 年开源推出的一个用于获取词向量(word vector)的工具包,它简单、高效,因此引起了很多人的关注。我在看了@peghoty所写的《word2vec中的数学以后》(个人觉得这是很好的资料,各方面...
  • Word2vec代码实现

    千次阅读 2019-10-31 19:07:33
    Word2vec纯python代码实现 1. 什么是 Word2vec? 在聊 Word2vec 之前,先聊聊 NLP (自然语言处理)。NLP 里面,最细粒度的是 词语,词语组成句子,句子再组成段落、篇章、文档。所以处理 NLP 的问题,首先就要拿...
  • 引子大家好我叫数据挖掘机皇家布鲁斯特大学肄业我喝最烈的果粒橙,钻最深的牛角尖——执着如我今天我要揭开Word2vec的神秘面纱直窥其本质相信我,这绝对是你看到的最浅白易懂的 Word2vec 中文总结(蛤?你问我为啥...
  • word2vec模型训练保存加载及简单使用

    千次阅读 多人点赞 2019-11-27 18:11:42
    word2vec模型训练保存加载及简单使用 一 word2vec简介 二、模型训练和保存及加载 模型训练 模型保存和加载 模型的增量训练 三、模型常用API 四、文本相似度计算——文档级别 word2vec模型训练保存加载及...
  • word2vec、glove和 fasttext 的比较

    万次阅读 多人点赞 2018-05-17 08:59:26
    Word2vec 处理文本任务首先要将文字转换成计算机可处理的数学语言,比如向量,Word2vec就是用来将一个个的词变成词向量的工具。 word2vec包含两种结构,一种是skip-gram结构,一种是cbow结构,skip-gram结构是利用...
  • Word2Vec&Doc2Vec总结

    千次阅读 2018-05-28 11:45:00
    1、词向量 自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化。  NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个...
  • 深度学习word2vec笔记之基础篇

    万次阅读 多人点赞 2014-05-25 16:00:16
    深度学习word2vec笔记之基础篇

空空如也

1 2 3 4 5 ... 20
收藏数 916,747
精华内容 366,698
关键字:

word2vec