精华内容
下载资源
问答
  • 向量基于语言模型的假设——“一个词的含义可以由它的上下文推断得出“,提出了词的Distributed Representation表示方法。相较于传统NLP的高维、稀疏的表示法(One-hot Representation),Word2Vec训练出的词向量是...
  • 30 种语言预训练词向量模型
  • 模型既可以用于训练词向量,也可以将句子表示成句子向量,质量都比较高
  • word2ver 词向量模型

    2018-02-26 20:12:05
    想用时找不到地方下载,找到了发出来大家共享下。欢迎大家一起交流学习
  • 基于改进多重测量向量模型的SAR成像算法
  • 空间向量模型

    2014-04-02 22:08:52
    空间向量模型 信息检索作业 基于倒排索引
  • 向量模型(1)

    千次阅读 2018-08-14 09:55:59
    向量模型 one-hot Vector one-hot vector 最简单的编码方式:假设我们的词库总共有n个词,那我们开一个1*n的高维向量,而每个词都会在某个索引index下取到1,其余位置全部都取值为0。 问题 这种词向量编码...

    词向量模型

    one-hot Vector

    one-hot vector

    最简单的编码方式:假设我们的词库总共有n个词,那我们开一个1*n的高维向量,而每个词都会在某个索引index下取到1,其余位置全部都取值为0。

    问题

    这种词向量编码方式简单粗暴,我们将每一个词作为一个完全独立的个体来表达。遗憾的是,这种方式下,我们的词向量没办法给我们任何形式的词组相似性权衡。因为你开了一个极高维度的空间,然后每个词语都会占据一个维度,因此没有办法在空间中关联起来。

    解决方案

    可以把词向量的维度降低一些,在这样一个子空间中,可能原本没有关联的词就关联起来了。

    基于 SVD 的方法

    SVD

    这是一种构造词嵌入(即词向量)的方法,我们首先会遍历所有的文本数据集,然后统计词出现的次数,接着用一个矩阵 X 来表示所有的次数情况,紧接着对X进行奇异值分解得到一个 USVT 的分解。然后用 U 的行(rows)作为所有词表中词的词向量。对于矩阵 X ,有2种选择:全文或者窗口长度。

    • 词-文档矩阵
      建立一个词组文档矩阵 X,具体是这么做的:遍历海量的文件,每次词组 i 出现在文件 j 中时,将 Xij 的值加1。不过大家可想而知,这会是个很大的矩阵R|V|×M,而且矩阵大小还和文档个数M有关系。所以咱们最好想办法处理和优化一下。word-document的共现矩阵最终会得到泛化的主题(例如体育类词汇会有相似的标记),这就是浅层语义分析(LSA, Latent Semantic Analysis)

    • 基于窗口的共现矩阵 X
      把矩阵X记录的词频变成一个相关性矩阵,对 X 做奇异值分解,观察奇异值(矩阵的对角元素),并根据我们期待保留的百分比来进行截断(只保留前k个维度),把子矩阵 U1:|V|,1:k 视作我们的词嵌入矩阵。也就是说,对于词表中的每一个词,我们都用一个 k 维的向量来表达了。窗口长度容易捕获语法(POS)和语义信息

    对共现矩阵X进行奇异值分解

    特征值分解与奇异值分解
    特征值分解只适用于方阵。当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。我们通过特征值分解得到的前N个特征向量,对应了这个矩阵最主要的N个变化方向。利用这前N个变化方向,可以近似这个矩阵(变换)。也就是 – 提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。
    奇异值分解是一个能适用于任意的矩阵的一种分解的方法,可以通过求特征值得到。

    Python中简单的词向量SVD分解

    问题

    • 矩阵的维度会经常变化(新的词语经常会增加,语料库的大小也会随时变化)。
    • 矩阵是非常稀疏的,因为大多数词并不同时出现。
    • 矩阵的维度通常非常高(≈106×106),需要大量的存储
    • 训练需要O(n2)的复杂度
    • 对于新词或者新的文档很难及时更新
    • 需要专门对矩阵X进行特殊处理,以应对词组频率的极度不平衡的状况

    解决方案:直接学习低维度的词向量

    idea: 将最重要的信息存储在固定的,低维度的向量里:密集向量(dense vector),维数通常是25-1000
    然而,如何降维?

    基于迭代的方法

    创建一个模型,它能够一步步迭代地进行学习,并最终得出每个单词基于其上下文的条件概率。

    n-gram

    基本思想: 一个词出现的概率只与它前面固定数目的词相关。
    主要工作是在预料中统计各种词串出现的次数以及平滑化处理,概率值计算号之后就存储起来,下次需要计算一个句子的概率时,只需找到相关的概率参数,将它们连乘起来就好了。
    建立一个概率模型,它包含已知和未知参数。每增加一个训练样本,它就能从模型的输入、输出和期望输出(标签),多学到一点点未知参数的信息。
    在每次迭代过程中,这个模型都能够评估其误差,并按照一定的更新规则,惩罚那些导致误差的参数。(误差“反向传播”法)。

    CBOW

    以 {“The”, “cat”, “over”, “the”, “puddle”} 为上下文,能够预测或产生它们中心的词语”jumped”。模型输入为 x(c),模型输出为 y,y 就是中心词 ‘jumped’。对于每个词语 wi 学习了两个向量。

    2.jpg

    连续词袋模型(CBOW)中的各个记号:

    • WiWi:单词表 V 中的第 i 个单词, one-hot 向量
    • v∈Rn∗|V|v∈Rn∗|V|:输入词矩阵
    • vivi:V的第i列,n 维 WiWi 的输入向量
    • U∈R|V|∗nU∈R|V|∗n:输出词矩阵
    • UiUi:U 的第 i 行,n 维 WiWi 的输出向量

    把整个过程拆分成以下几步:

    • 对于 m 个词长度的输入上下文,我们产生它们的 one-hot 向量 (xc−m,⋯,xc−1,xc+1,⋯,xc+m)(xc−m,⋯,xc−1,xc+1,⋯,xc+m),作为模型输入。
    • 我们得到上下文的嵌入词向量 (vc−m+1=Vxc−m+1,⋯,vc+m=Vxc+m)(vc−m+1=Vxc−m+1,⋯,vc+m=Vxc+m)
    • 将这些向量取平均 vˆ=Vc−m+Vc−m+1+⋯+Vc+m2mv^=Vc−m+Vc−m+1+⋯+Vc+m2m
    • 产生一个得分向量 z=Uvˆz=Uv^
    • 将得分向量转换成概率分布形式 yˆ=softmax(z)y^=softmax(z)
    • 我们希望我们产生的概率分布 ,与真实概率分布 yˆy^ 相匹配。而 y 刚好也就是我们期望的真实词语的one-hot向量。

    怎样找到矩阵U、V?
    目标函数选交叉熵,用梯度下降法去更新每一个相关的词向量 UcUc 和 VjVj.

    当我们试图从已知概率学习一个新的概率时,最常见的是从信息论的角度寻找方法来评估两个概率分布的差距。其中广受好评又广泛应用的一个评估差异/损失的函数是交叉熵:
    H(yˆ,y)=−∑|V|j=1yjlog(yˆj)H(y^,y)=−∑j=1|V|yjlog(y^j)

    结合我们当下的例子,y 只是一个one-hot向量,于是上面的损失函数就可以简化为:
    H(yˆ,y)=−yjlog(yˆj)H(y^,y)=−yjlog(y^j)

    我们用 c 表示 y 这个 one-hot 向量取值为 1 的那个维度的下标。所以在我们预测为准确值的情况下 yˆc=1y^c=1。于是损失为 −1 log(1) = 0。所以对于一个理想的预测值,因为预测得到的概率分布和真实概率分布完全一样,因此损失为0。相反,当我们的预测结果非常不理想, yˆc=0.01y^c=0.01。计算得到的损失为−1 log(0.01) ≈ 4.605,损失非常大,原本这才是标准结果,可是你给了一个非常低的概率,因此会拿到一个非常大的loss。最终的优化函数为:

    Skip-Gram

    与上面提到的模型对应的另一种思路,是以中心的词语 ”jumped” 为输入,能够预测或产生它周围的词语 ”The”, “cat”, “over”, “the”, “puddle” 等。这里我们叫 ”jumped” 为上下文。我们把它叫做Skip-Gram 模型。

    这个模型的建立与连续词袋模型(CBOW)非常相似,但本质上是交换了输入和输出的位置。我们令输入的 one-hot 向量(中心词)为 x(因为它只有一个),输出向量为 y(j)。U 和 V 的定义与连续词袋模型一样。看一下网络结构图:

    1.jpg

    举个例子,假设现在的数据集如下:

    the quick brown fox jumped over the lazy dog

    这个数据集中包含了词语及其上下文信息。上下文信息(Context)是一个比较宽泛的概念,有多种不同的理解:例如,词语周边的句法结构,词语的左边部分的若干个词语信息,对应的右半部分等。这里,我们使用最原始和基本的定义,即认为词语左右相邻的若干个词汇是该词对应的上下文信息。例如,取左右的词窗口为1,下面是数据集中的(上下文信息,对应的词)的pairs:

    ([the, brown], quick), ([quick, fox], brown), ([brown, jumped], fox), ...

    Skip-Gram模型是通过输入的目标词来预测其对应的上下文信息,所以目标是通过[quick]来预测[the]和[brown],通过[brown]来预测[quick]和[fox]… 将上面的pair转换为(inpUt, output)的形式如下:

    (quick, the), (quick, brown), (brown, quick), (brown, fox), ...

    对应到上面部分,我们可以把 Skip-Gram 模型的运作方式拆分成以下几步:

    • 生成 one-hot 输入向量 x。
    • 得到上下文的嵌入词向量 VcVc=VxVx。
    • 因为这里不需要取平均值的操作,所以直接是vˆ=vcv^=vc。
    • 通过U=UVcU=UVc产生 2m 个得分向量 Uc−m,⋯,Uc−1,Uc+1,⋯,Uc+mUc−m,⋯,Uc−1,Uc+1,⋯,Uc+m,如果上下文各取一个词,就是 Uc−1Uc−1, Uc+1Uc+1
    • 将得分向量转换成概率分布形式 y=softmax(u)y=softmax(u)。
    • 我们希望我们产生的概率分布与真实概率分布 yc−m,⋯,yc−1,,yc+1⋯,yc+myc−m,⋯,yc−1,,yc+1⋯,yc+m 相匹配,也就是我们真实输出结果的 one-hot 向量。

    为模型设定一个目标/损失函数。不过不同的地方是我们这里需要引入朴素贝叶斯假设来将联合概率拆分成独立概率相乘。只要给出了中心词,所有的输出词是完全独立的。使用随机梯度下降算法(SGD)来进行最优化求解,并且使用mini-batch方法 (通常batch_size在16到512之间)。可以用随机梯度下降法去更新未知参数的梯度。
    对应的优化函数是

    这里值得一提的是,skipgram 和 PMI 之间是有联系的,Levy and Goldberg(2014) 提到过,skip-gram 在矩阵成为 PMI 的一个 shifted version 时(WW‘T=MPMI−logkWW‘T=MPMI−logk),得到最优解,也就是说,

    Skip-gram is implicitly factoring a shifted version of the PMI matrix into the two embedding matrices.

    我们再次观察一下目标函数,注意到对整个单词表|V|求和的计算量是非常巨大的,任何一个对目标函数的更新和求值操作都会有O(|V|)的时间复杂度。我们需要一个思路去简化一下,我们想办法去求它的近似,可以参照负面采样(Negative Sampling)

    why skip-gram

    在NLP中,语料的选取是一个相当重要的问题。
    首先,语料必须充分。一方面词典的词量要足够大,另一方面尽可能地包含反映词语之间关系的句子,如“鱼在水中游”这种句式在语料中尽可能地多,模型才能学习到该句中的语义和语法关系,这和人类学习自然语言是一个道理,重复次数多了,也就会模型了。
    其次,语料必须准确。所选取的语料能够正确反映该语言的语义和语法关系。如中文的《人民日报》比较准确。但更多时候不是语料选取引发准确性问题,而是处理的方法。
    由于窗口大小的限制,这会导致超出窗口的词语与当前词之间的关系不能正确地反映到模型中,如果单纯扩大窗口大小会增加训练的复杂度。Skip-gram模型的提出很好解决了这些问题。

    我们来看看 skip-gram 的定义。

    Skip-gram 实际上的定义很简单,就是允许跳几个字的意思。依照原论文里的定义,这个句子:

    Insurgents killed in ongoing fighting.

    在 bi-grams 的时候是拆成:

    { insurgents killed, killed in, in ongoing, ongoing fighting }

    在 2-skip-bi-grams 的时候拆成:

    { insurgents killed, insurgents in, insurgents ongoing, killed in, killed ongoing, killed fighting, in ongoing, in fighting, ongoing fighting }

    在 tri-grams 的时候是:

    { insurgents killed in, killed in ongoing, in ongoing fighting }

    在 2-skip-tri-grams 的时候是:

    { insurgents killed in, insurgents killed ongoing, insurgents killed fighting, insurgentsin ongoing, insurgents in fighting, insurgents ongoing fighting, killed in ongoing, killed in fighting, killed ongoing fighting, in ongoing fighting }

    这样就有办法在整篇文章都是用“台湾大学”的情况下以“台大”找到文章,解决一些“同义词”想要解决的问题。Skip-gram 一方面反映了句子的真实意思,另一方面还扩大了语料,2元词组由原来的4个扩展到了9个,3元词组由原来的3个扩展到了10个。

    Word2Vec

    Word2Vec 是一个典型的预测模型,用于高效地学习Word Embedding,实现的模型就是上面提到的两种:连续词袋模型(CBOW)和Skip-Gram模型。算法上这两个模型是相似的

    • CBOW 从输入的上下文信息来预测目标词
    • Skip-gram 模型则是相反的,从目标词来预测上下文信息
      一般而言,这种方式上的区别使得 CBOW 模型更适合应用在小规模的数据集上,能够对很多的分布式信息进行平滑处理;而 Skip-Gram 模型则比较适合用于大规模的数据集上。

    另外一点是,embeddings 可以来捕捉关系!
    3.jpg

    向量空间模型(Vector space models, VSMs)

    将词语表示为一个连续的词向量,并且语义接近的词语对应的词向量在空间上也是接近的。
    分布式假说理论: 该假说的思想是如果两个词的上下文(context)相同,那么这两个词所表达的语义也是一样的;换言之,两个词的语义是否相同或相似,取决于两个词的上下文内容,上下文相同表示两个词是可以等价替换的。

    词向量生成方法主要分两大类:

    • 计数法(count-based methods, e.g. Latent Semantic Analysis)
      在大型语料中统计词语及邻近的词的共现频率,然后将之为每个词都映射为一个稠密的向量表示;
    • 预测法(predictive methods, e.g. neural probabilistic language models)。
      直接利用词语的邻近词信息来得到预测词的词向量(词向量通常作为模型的训练参数)。

    词向量任务评价

    内部任务评价

    内部任务评价的特点如下:

    • 一般是在一个特定的子任务中进行评测
    • 计算很快
    • 有助于理解相关的系统
    • 在实际的NLP任务中表现好坏,可能需要外部关联实际应用

    方法:词向量类比

    我们先输入一组不完整的类比 a:b::c:? 内部任务评价系统找出最大化余弦相似度的词向量
    理想情况下,我们想得到xb−xa=xd−xc(例如,王后–国王 = 女演员 – 男演员)。于是xb−xa+xc=xd, 所以我们只需要找出一个与xb−xa+xc的标准化内积(比如余弦相似度)取最大值的词向量就可以了。

    类比语料示例:

    首都城市1 : 国家1 : : 首都城市2 : 国家2
    Beijing:China::Astana       Kazakhstan
    Beijing:China::Asmara       Eritrea
    ...
    
    比较级
    bad:worst::big            biggest
    bad:worst::easy           easiest
    ...
    
    时态
    dancing:danced::decreased         decreased
    dancing:danced::falling           fell
    ...
    

    评测语料

    方法:相关性评价

    另外一个评测词向量质量的简单方法是人为对两个词的相似度在一个固定区间内打分(比如说 0-10),再跟对应向量的余弦相适度进行对比。
    评测语料

    考虑参数

    • 词向量的维度
    • 资料库的大小
    • 资料源/类型
    • 上下文窗口的大小
    • 上下文的对称性

    一般而言,

    • 精度和使用的模型高度相关,因为这些生成词向量的方法所依据的特性是完全不同的(如同时出现的次数,奇异向量等。)
    • 文集量越大,精度越高,因为例子越多,生成的系统学习到的经验就更丰富。比如在完成词汇类比的例子中,系统如果之前没有接触测试词,就可能会生成错误的结果。
    • 如果维度特别低或特别高,精度就会比较低。低维度词向量无法捕捉文集中不同词语的不同意义。这可以视为我们模型复杂度过低而导致的高偏差。比如 “king”, “queen”, “man”, “woman” 这几个词,我们需要至少2个维度像”gender” 如 “leadership” 来把它们编译成 2-字节 词向量。 过低的维度将无法捕捉四个词之间的语义差别,而过高的维度将捕捉到一些对泛化能力没有用的噪音– 即高方差的问题。

    外部任务评价

    外部任务评价的特点如下:

    • 在一个实际任务中进行评测
    • 需要花很长的时间来计算精度
    • 不太清楚是否是某个子系统或者其他子系统,又或是几个子系统互相作用引起的问题
    • 如果替换原有的子系统后获得精度提升,则说明替换很可能是有效的

    参考链接:
    斯坦福大学课程:深度学习与自然语言处理
    斯坦福大学深度学习与自然语言处理第二讲:词向量

    转自: http://www.shuang0420.com/2016/06/21/%E8%AF%8D%E5%90%91%E9%87%8F%E6%80%BB%E7%BB%93%E7%AC%94%E8%AE%B0%EF%BC%88%E7%AE%80%E6%B4%81%E7%89%88%EF%BC%89/

    展开全文
  • 空间向量模型源代码

    2014-01-14 20:06:10
    可直接运行,利用空间向量模型建立简单的布尔检索,内含源代码与用于搜索的TXT文本,可以替换
  • 一、前言 ...使用one-hot向量来表示字词,那么一个字词就需要一个词表大小的向量,而NLP任务中的词表往往是上万甚至上百万的,这会极大地增加神经网络中的参数数量。 ② 距离一致。使用one-hot...

    一、前言

    请勿全文复制转载!尊重劳动成果!

            在使用词向量之前,我们往往用one-hot向量来表示一个字词,这样有两个缺点:

                 ① 维度过大。使用one-hot向量来表示字词,那么一个字词就需要一个词表大小的向量,而NLP任务中的词表往往是上万甚至上百万的,这会极大地增加神经网络中的参数数量。

                 ② 距离一致。使用one-hot表示字词,会使得所有字词之间的相似性是一致的,而在我们的认知中,“苹果”和“梨子”要比“苹果”和“英语”更接近。

             而词向量能将原本用one-hot表示的字词压缩到更小的维度,而且相似字词之间的距离更小。那词向量是如何表示字词的这种相似性的呢。很简单,词向量通过字词的上下文语境来表示这个字词,而相似的字词往往拥有相似的上下文语境。比如“苹果”和“梨子”可能都经常和“吃”、“水果”等词一起出现,那么“苹果”和“梨子”的词向量就会比较接近,而“英语”的上下文语境往往是“说”、“学习”等,那么“苹果”、“梨子”与“英语”之间就会差异较大。

            要表达这种相似性,只需要建立这样一个模型:当输入“吃”的时候,模型输出“苹果”的概率较大,输出“英语”的概率较小。即输入一个字词,模型输出与这个字词共同出现的其他字词的概率。模型会学习到这种相似性,并将其体现到隐层权重之上。

           显然,上面的模型与语言模型极其相似,语言模型的任务是根据上下文预测下一个字词。因此我们可以借用语言模型来训练词向量,词向量从一开始就和语言模型是密不可分的。

    二、词向量

            在开始讲解词向量之前,请你先思考这样一个问题:给你一个字词,需要你构建一个最简单的神经网络模型来预测下一个字词是什么。

            对于这个问题,不使用词向量,不使用RNN,我想你最先能想出来的就是下面这个两层的全连接模型了。

    模型使用one-hot向量来表示一个字词,所以input层表示一个one-hot向量的输入,经过一个全连接层后得到一个隐藏层向量,在经过softmax层得到一个概率输出,概率最大对应的字词就是我们预测出的字词。

           实际上,这已经是一个最简单的语言模型了,只不过最早的NNLM的input层是连续的多个字词,而且隐藏层要更多。

    以 “小明不但喜欢吃梨子,还喜欢吃苹果” 为例,观察上述模型。对于这句话,我们可以获得数据集如下:

    (小明,不但)
    (不但,喜欢)
    (喜欢,吃)
    (吃,梨子)
    (还,喜欢)
    (喜欢,吃)
    (吃,苹果)

    将上述数据放入模型训练,毫无疑问当出现“喜欢”时,下一个词大概率会是“吃”,而出现“吃”时,很有可能会是“梨子”或者“苹果”。

           其实,上述模型就是我们用来训练词向量的模型,与语言模型不同的是,语言模型通过前n个词预测下一个词,而词向量通过上下文来预测当前词,或者通过当前词来预测词上下文,而 "前n个词" 不也是上下文的一种吗。

    三、skip-gram

            skip-gram是一种通过当前词预测上下文的词向量训练方法,为了更好地体现不同词之间的依赖情况,显然不能只选取当前词的前一个词作为上下文。为了选定当前词的上下文,skip-gram采取这样一种策略:记当前词为w_i,从[w_i_-_k:w_i_-_1][w_i_+_1:w_i_+_k]中随机选取n个词作为w_i的上下文,即:从当前词的前k个词和后k个词中选择n个。k和n均为超参数,n<=2k。

    注:当语料库较小时,建议采用5-20等较大的k值,当语料库较大时,建议采用1-4等较小的k值。

    以下面这句话为例,假设k为2,n为2,当前词为 “喜欢” 时,从前2个词和后2个词中假设随机选取了“小明”和“梨子”作为上下文,于是得到两组训练数据:(喜欢,小明)、(喜欢,梨子)

    而对大量语句按如上方法提取出训练数据,输入模型训练完毕后,模型就能够学习到具有相似上下文语境的字词表示,训练完成后的W1矩阵就是我们需要的词向量矩阵。为了进一步理解这个概念,我们分析模型的前向传播过程,为了方便理解,假设词表大小为5,模型隐藏层大小为4,该模型描述如下:

    为了简单起见,我使用w1表示权重矩阵W1中的所有元素,使用w2表示权重矩阵W2中的所有元素,使用x1表示隐藏层中间向量中X1的所有元素,使用x2表示softmax输出的X2中的所有元素(大写表示矩阵或向量,小写表示元素)。

    由于许多词的上下文语境可能会很相似,如对于“苹果”和“梨子”,出现下面的(input,label)对的情况可能非常多:

    (梨子,吃)         (苹果,吃)
    (梨子,水果)       (苹果,水果)

    两个词的上下文语境相似,体现在训练数据中就是他们对应的label会有许多重合。观察模型的后半部分,当模型训练完成,W2固定,在softmax output层要输出相似的label,那么softmax output层的输入也要相似,即“苹果”和“梨子”的hidden layer层的输出(即X1)会比较相似。实际上,X1就是我们要求的词向量。

    再观察模型的前半部分,hidden layer层是输入层的one-hot向量与权重矩阵W1做矩阵运算的结果,记输入的one-hot向量为1的元素下标为i,与W1做矩阵运算后的结果实际就是W1的第i行向量,因此,W1就是我们要求的词向量矩阵,它是整个词汇表中的字词的词向量在0轴上的堆叠

    四、负采样

            Softmax的计算公式为:

                                                                                  p(x_i)=\frac{e^{x_i}}{\sum_{j=1}^{voc}e^{x_j}}

    其中,voc是词汇表的长度,而在我们的语料库中,词汇表的的长度往往高达数十万,使用softmax做一个数十万类的分类任务,这个计算量显然太大了,因此,我们需要优化模型中最后的softmax层,而对于一个类别过大的分类任务,我们可以使用负采样技术。

    记词汇表大小为vocab_size,softmax层每次输出一个vocab_size的的向量,向量中的每个元素代表预测是该词的概率,然后我们选取概率最大的作为预测标签,标记为1,其余vocab_size-1个元素全部标记为0,这实际上可以看做是vocab_size个二元分类器的集合,训练的过程就是使得正确标签对应的二元分类器能够输出1,而其他二元分类器输出0。

    而我们的模型要做的,就是对于某个输入,将正确的类别标签与其他标签分离开来。softmax所做的是计算所有标签的可能性,然后增大正确标签所对应的概率、减小其他标签的概率来将其与其他所有标签分离。这是一个非常庞大而且严格的分离过程,为什么说它庞大严格?对于一个词汇表大小为100,000的词向量训练模型来说,每次需要将1个标签与其他99,999个标签分离,这显然很庞大,其次,每次训练都增大其中一个标签的预测概率,而其他99,999个标签的概率全部都减小,这显然是严格的,因为在词向量模型中,同样的输入可能会对应不同的正确输出,如(梨子,吃)和(梨子,水果),当输入梨子时,输出可以是吃,也可以是水果。

    那么,为了将正确标签与其他标签分离开来,我们无需每次都计算所有标签,而是只计算正确标签和一部分其他标签,即从错误标签中随机选取部分,与正确标签作为对照,以将正确标签从其他标签中分离,这就是负采样技术。

    回到词向量中来,仍旧以“小明不但喜欢吃梨子” 为例,当中心词为“喜欢”时,我们得到了(喜欢,小明)和(喜欢,梨子)两组数据。

    我们只看(喜欢,小明)这组数据,对于“喜欢” 来说,“小明”就是他的正标签,而对应的,我们从词汇表中选取num_sample个词作为负标签,以形成对照,于是得到如下训练数据:

    图中示例num_sample=2。记中心词为wi,正标签词为C,负标签词集合为C_{nce},则我们需要最大化以下函数:

                                      J=logQ(label=1|w_i,C)+\sum_{c_i\in C_{nce}}^{ }logQ(label=0|w_i,c_i)

    其中logQ(label=1|w_i,C)是当wi出现时看到C同时出现的概率。

            在tensorflow中提供了tf.nn.nce_loss()函数能够很方便地实现以上功能,在tensorflow中称之为噪声对比估算 (NCE) 损失,它的具体实现原理如下:

            同样的使用的是之前的词向量训练模型,我们只关注后半部分,tf.nn.nce_loss()不会在整个词汇表范围上做计算,而是首先拿出真实标签的下标,并从其他标签中随机选取num_sample个,如图中红色部分标注的真实标签(index=3)和两个随机噪声标签(index=0,index=2),根据选取出来的下标从权重矩阵W2中分理出第0,2,3列,与hidden layer中的X1做矩阵运算,得到x_{2,0},x_{2,2},x_{2,3},之后对x_{2,0},x_{2,2},x_{2,3}使用sigmoid函数激活得到X3,与从true label中分离出来的label计算sigmoid cross entropy,输出loss。

            这也就是为什么有人说使用负采样技术实际上是只更新部分权重,效率比完整的softmax快很多的原因,使用负采样技术后,每次训练迭代更新的都只是真实标签和num_sample个噪声标签所对应的权重。

    然后介绍一下tf.nn.nce_loss()

    def nce_loss(weights,
                 biases,
                 labels,
                 inputs,
                 num_sampled,
                 num_classes,
                 num_true=1,
                 sampled_values=None,
                 remove_accidental_hits=False,
                 partition_strategy="mod",
                 name="nce_loss"):

    参数解释:

    weights:上述W2权重矩阵
    biases:与W2对应的偏移矩阵
    labels:真实标签的对应下标,shape=[batch_size,1]
    inputs:上述hidden layer的输出,其实就是词向量集合,shape=[batch_size, embed_size]
    num_sampled:负采样个数
    num_classes:完整分类数,其实就是词表大小

    因此,在使用tf.nn.nce_loss()函数时,我们的输入数据仍旧是下面这种形式:

    (喜欢,小明)
    (喜欢,梨子)

    函数会自动帮我们针对每一组输入进行负采样,以输出噪声对比估算损失。

    展开全文
  • 向量空间模型在信息检索中是众所周知的,其中每个文档被表示为向量。矢量分量表示文档中每个单词的权重或重要性。使用余弦相似性度量计算两个文档之间的相似性。 尽管对单词使用矢量表示的想法也已经存在了一段时间...

    Word2vec

    向量空间模型在信息检索中是众所周知的,其中每个文档被表示为向量。矢量分量表示文档中每个单词的权重或重要性。使用余弦相似性度量计算两个文档之间的相似性。

    尽管对单词使用矢量表示的想法也已经存在了一段时间,但是对于嵌入单词的技术,将单词映射到向量的技术,最近一直在飙升。其中一个驱动因素是TomášMikolov的Word2vec算法,该算法使用大量文本来创建高维(50到300维)的单词表示,捕获单词之间的关系,无需外部注释。这种表述似乎捕获了许多语言规律。例如,它产生一个近似于vec(‘Rome’)表示的向量,作为向量运算vec(‘Paris’) - vec(‘France’)+ vec(‘Italy’)的结果。

    Word2vec使用单个隐藏层,完全连接的神经网络如下所示。隐藏层中的神经元都是线性神经元。输入层设置为具有与用于训练的词汇中的单词一样多的神经元。隐藏图层大小设置为生成的单词向量的维度。输出图层的大小与输入图层相同。因此,假设用于学习单词向量的词汇表由V个单词组成并且N为单词向量的维度,则对隐藏层连接的输入可以由大小为VxN的矩阵WI表示,其中每行表示词汇单词。以相同的方式,可以通过矩阵WO来描述从隐藏层到输出层的连接大小为NxV。在这种情况下,WO矩阵的每列 表示来自给定词汇表的单词。使用“ 1-out of -V ”表示对网络的输入进行编码,这意味着只有一条输入线被设置为1,其余输入线被设置为零。
    在这里插入图片描述
    为了更好地处理Word2vec的工作原理,请考虑具有以下句子的训练语料库:

    “狗看到了一只猫”,“狗追着猫”,“猫爬上了一棵树”

    语料库词汇有八个单词。按字母顺序排序后,每个单词都可以通过其索引引用。对于这个例子,我们的神经网络将有八个输入神经元和八个输出神经元。让我们假设我们决定在隐藏层中使用三个神经元。这意味着WI和WO将分别是8×3和3×8矩阵。在训练开始之前,这些矩阵被初始化为小的随机值,如通常在神经网络训练中那样。仅为了说明,让我们假设WI和WO初始化为以下值:

    WI =
    在这里插入图片描述
    W0 =

    在这里插入图片描述
    假设我们希望网络学习单词“cat”和“climb”之间的关系。也就是说,当“猫”输入到网络时,网络应该显示“攀爬”的高概率。在单词嵌入术语中,单词“cat”被称为上下文单词,单词“climbed”被称为目标单词。在这种情况下,输入矢量X将是[0 1 0 0 0 0 0 0] t。请注意,只有向量的第二个分量是1.这是因为输入的单词是“cat”,它在语料库单词的排序列表中保持第二个位置。鉴于目标字是“爬升”,目标矢量看起来像[0 0 0 1 0 0 0 0] t。

    利用表示“cat”的输入向量,可以将隐藏层神经元的输出计算为

    H t = X t WI = [-0.490796 -0.229903 0.065460]

    我们不应该感到惊讶的是隐藏神经元输出的向量H模仿了WI矩阵的第二行的权重,因为V表示为1-out-of-V。因此隐藏层连接的输入功能基本上是将输入字向量复制到隐藏层。对隐藏到输出层执行类似的操作,输出层神经元的激活矢量可以写成

    H t WO = [0.100934 -0.309331 -0.122361 -0.151399 0.143463 -0.051262 -0.079686 0.112928]

    由于目标是为输出层中的单词生成概率, 对于k = 1,V的Pr(单词k |单词上下文),为了反映它们与输入处的上下文单词的下一个单词关系,我们需要神经元输出的总和。输出图层添加到一个。Word2vec通过使用softmax函数将输出层神经元的激活值转换为概率来实现此目的。因此,第k个神经元的输出通过以下表达式计算,其中activation(n)表示第n个输出层神经元的激活值:
    在这里插入图片描述
    因此,语料库中八个单词的概率是:

    0.143073 0.094925 0.114441 0.111166 0.149289 0.122874 0.119431 0.144800

    粗体的概率是针对所选择的目标词“攀爬”。给定目标矢量[0 0 0 1 0 0 0 0] t,通过从目标矢量中减去概率矢量,可以容易地计算输出层的误差矢量。一旦知道了错误,就可以使用反向传播来更新矩阵WO和WI中
    的权重。因此,训练可以通过从语料库呈现不同的上下文目标词对来进行。从本质上讲,这就是Word2vec如何学习单词之间的关系,并在此过程中开发语料库中单词的向量表示。

    例句
    Jane wants to go to Shenzhen.

    Bob wants to go to Shanghai.

    **

    一、词袋模型

    将所有词语装进一个袋子里,不考虑其词法和语序的问题,即每个词语都是独立的。例如上面2个例句,就可以构成一个词袋,袋子里包括Jane、wants、to、go、Shenzhen、Bob、Shanghai。假设建立一个数组(或词典)用于映射匹配

    [Jane, wants, to, go, Shenzhen, Bob, Shanghai]
    那么上面两个例句就可以用以下两个向量表示,对应的下标与映射数组的下标相匹配,其值为该词语出现的次数
    [1,1,2,1,1,0,0]
    [0,1,2,1,0,1,1]

    这两个词频向量就是词袋模型,可以很明显的看到语序关系已经完全丢失。

    二、词向量模型

    词向量模型是考虑词语位置关系的一种模型。通过大量语料的训练,将每一个词语映射到高维度(几千、几万维以上)的向量当中,通过求余弦的方式,可以判断两个词语之间的关系,例如例句中的Jane和Bob在词向量模型中,他们的余弦值可能就接近1,因为这两个都是人名,Shenzhen和Bob的余弦值可能就接近0,因为一个是人名一个是地名。

    现在常用word2vec构成词向量模型,它的底层采用基于CBOW和Skip-Gram算法的神经网络模型。

    1. CBOW模型

    CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。比如上面的第一句话,将上下文大小取值为2,特定的这个词是"go",也就是我们需要的输出词向量,上下文对应的词有4个,前后各2个,这4个词是我们模型的输入。由于CBOW使用的是词袋模型,因此这4个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可。

    这样我们这个CBOW的例子里,我们的输入是4个词向量,输出是所有词的softmax概率(训练的目标是期望训练样本特定词对应的softmax概率最大),对应的CBOW神经网络模型输入层有4个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某4个词对应的最可能的输出中心词时,我们可以通过一次DNN前向传播算法并通过softmax激活函数找到概率最大的词对应的神经元即可。

    以上描述和架构旨在用于学习单词对之间的关​​系。在连续的单词模型中,上下文由给定目标单词的多个单词表示。例如,我们可以使用“cat”和“tree”作为“攀爬”的上下文单词作为目标单词。这需要修改神经网络架构。如下所示,修改包括将隐藏层连接的输入复制C次,上下文单词的数量,以及在隐藏层神经元中添加除C操作。[警报读者指出,下图可能会让一些读者认为CBOW学习使用了几个输入矩阵。不是这样。它是相同的矩阵WI,它接收代表不同上下文词的多个输入向量]

    以上描述和架构旨在用于学习单词对之间的关​​系。在连续的单词模型中,上下文由给定目标单词的多个单词表示。例如,我们可以使用“cat”和“tree”作为“攀爬”的上下文单词作为目标单词。这需要修改神经网络架构。如下所示,修改包括将隐藏层连接的输入复制C次,上下文单词的数量,以及在隐藏层神经元中添加除C操作。[警报读者指出,下图可能会让一些读者认为CBOW学习使用了几个输入矩阵。不是这样。它是相同的矩阵WI,它接收代表不同上下文词的多个输入向量]

    在这里插入图片描述
    利用上述配置来指定C上下文字,使用1-out-of-V表示编码的每个字意味着隐藏层输出是与输入处的上下文字相对应的字矢量的平均值。输出层保持不变,并且以上面讨论的方式完成训练。

    2.Skip-Gram模型

    Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。还是上面的例子,我们的上下文大小取值为2, 特定的这个词"go"是我们的输入,而这4个上下文词是我们的输出。

    这样我们这个Skip-Gram的例子里,我们的输入是特定词, 输出是softmax概率排前4的4个词,对应的Skip-Gram神经网络模型输入层有1个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某1个词对应的最可能的4个上下文词时,我们可以通过一次DNN前向传播算法得到概率大小排前4的softmax概率对应的神经元所对应的词即可。

    Skip-gram模型反转了目标和上下文单词的使用。在这种情况下,目标字在输入处被馈送,隐藏层保持相同,并且神经网络的输出层被多次复制以适应所选数量的上下文字。以“cat”和“tree”为例,作为上下文单词,“爬”作为目标词,skim-gram模型中的输入向量为[0 0 0 1 0 0 0 0] t,而两个输出层将具有[0 1 0 0 0 0 0 0] t和[0 0 0 0 0 0 0 1] t分别作为目标向量。代替产生一个概率向量,将为当前示例产生两个这样的向量。以上面讨论的方式产生每个输出层的误差向量。然而,将来自所有输出层的误差向量相加以通过反向传播来调整权重。这确保了每个输出层的权重矩阵WO在整个训练中保持相同。

    词向量模型突出特点:

    在词向量模型中,词向量与词向量之间有这非常特殊的特性。例如现在存在国王、男生、女人、皇后四个词向量,那么一个完善的词向量模型,就存在“国王-男人+女人=皇后”这样的关系。

    在这里插入图片描述

    展开全文
  • 详解GloVe词向量模型

    千次阅读 多人点赞 2019-08-04 21:26:52
      词向量的表示可以分成两个大类1:基于统计方法例如共现矩阵、奇异值分解SVD;2:基于语言模型例如神经网络语言模型(NNLM)、word2vector(CBOW、skip-gram)、GloVe、ELMo。   word2vector中的skip-gram模型是...

      词向量的表示可以分成两个大类1:基于统计方法例如共现矩阵、奇异值分解SVD;2:基于语言模型例如神经网络语言模型(NNLM)、word2vector(CBOW、skip-gram)、GloVe、ELMo。
      word2vector中的skip-gram模型是利用类似于自动编码的器网络以中心词的one-hot表示作为输入来预测这个中心词环境中某一个词的one-hot表示,即先将中心词one-hot表示编码然后解码成环境中某个词的one-hot表示(多分类模型,损失函数用交叉熵)。CBOW是反过来的,分别用环境中的每一个词去预测中心词。尽管word2vector在学习词与词间的关系上有了大进步,但是它有很明显的缺点:只能利用一定窗长的上下文环境,即利用局部信息,没法利用整个语料库的全局信息。鉴于此,斯坦福的GloVe诞生了,它的全称是global vector,很明显它是要改进word2vector,成功利用语料库的全局信息。

    1. 共现概率

    什么是共现?
      单词 i i i出现在单词 j j j的环境中(论文给的环境是以 j j j为中心的左右10个单词区间)叫共现。

    什么是共现矩阵?
      单词对共现次数的统计表。我们可以通过大量的语料文本来构建一个共现统计矩阵。
      例如,有语料如下:
      I like deep learning.
      I like NLP.
      I enjoy flying.
      我以窗半径为1来指定上下文环境,则共现矩阵就应该是[2]
    共现矩阵
      取 x 01 x_{01} x01解释:它表示 l i k e like like出现在 I I I的环境( I l i k e I like Ilike区间)中的次数(在整个语料库中的总计次数),此处应当为2次,故第一行第二列应当填2。还应当发现,这个共现矩阵它是对称阵,因为 l i k e like like出现在 I I I的环境中,那么必然 I I I也会出现在 l i k e like like的环境中,所以 x 10 x_{10} x10=2。
      共现矩阵它有以下3个特点:
      ·统计的是单词对在给定环境中的共现次数;所以它在一定程度上能表达词间的关系。
      ·共现频次计数是针对整个语料库而不是一句或一段文档,具有全局统计特征。
      ·共现矩阵它是对称的。

    共现矩阵的生成步骤:
      · 首先构建一个空矩阵,大小为 V × V V ×V V×V,即词汇表×词汇表,值全为0。矩阵中的元素坐标记为 ( i , j ) (i,j) (i,j)
      · 确定一个滑动窗口的大小(例如取半径为m)
      · 从语料库的第一个单词开始,以1的步长滑动该窗口,因为是按照语料库的顺序开始的,所以中心词为到达的那个单词即 i i i
      · 上下文环境是指在滑动窗口中并在中心单词 i i i两边的单词(这里应有2m-1个 j j j)。
      · 若窗口左右无单词,一般出现在语料库的首尾,则空着,不需要统计。
      · 在窗口内,统计上下文环境中单词 j j j出现的次数,并将该值累计到 ( i , j ) (i,j) (i,j)位置上。
      · 不断滑动窗口进行统计即可得到共现矩阵。

    什么是叫共现概率?
      我们定义 X X X为共现矩阵,共现矩阵的元素 x i j x_{ij} xij为词 j j j出现在词 i i i环境的次数,令 x i = ∑ k x i k x_i=\sum_kx_{ik} xi=kxik为任意词出现在 i i i的环境的次数(即共现矩阵行和),那么, P i j = P ( j ∣ i ) = x i j x i P_{ij}=P(j|i)={x_{ij}\over x_{i}} Pij=P(ji)=xixij
      为词 j j j出现在词 i i i环境中的概率(这里以频率表概率),这一概率被称为词 i i i和词 j j j的共现概率。共现概率是指在给定的环境下出现(共现)某一个词的概率。注意:在给定语料库的情况下,我们是可以事先计算出任意一对单词的共现概率的。

    2. 共现概率比

      接下来阐述为啥作者要提共现概率和共现概率比这一概念。下面是论文中给的一组数据:
    共现概率比
      先看一下第一行数据,以 i c e ice ice为中心词的环境中出现 s o l i d solid solid固体的概率是大于 g a s 、 f a s h i o n gas、fashion gasfashion的而且是小于 w a t e r water water的,这是很合理的,对吧!因为有 i c e ice ice的句子中出现 s o l i d 、 w a t e r solid、water solidwater的概率确实应当比 g a s 、 f a s h i o n gas、fashion gasfashion大才对,实验数据也说明的确是如此。同理可以解释第二行数据。我们来重点考虑第三行数据:共现概率比。我们把共现概率进行一比,我们发现:
      1.看第三行第一列:当 i c e ice ice的语境下共现 s o l i d solid solid的概率应该很大,当 s t r e a m stream stream的语境下共现 s o l i d solid solid的概率应当很小,那么比值就>1。
      2.看第三行第二列:当 i c e ice ice的语境下共现 g a s gas gas的概率应该很小,当 s t r e a m stream stream的语境下共现 g a s gas gas的概率应当很大,那么比值就<1。
      3.看第三行第三列:当 i c e ice ice的语境下共现 w a t e r water water的概率应该很大,当 s t r e a m stream stream的语境下共现 w a t e r water water的概率也应当很大,那么比值就近似=1。
      4.看第三行第四列:当 i c e ice ice的语境下共现 f a s h i o n fashion fashion的概率应该很小,当 s t r e a m stream stream的语境下共现 f a s h i o n fashion fashion的概率也应当很小,那么比值也是近似=1。
      因为作者发现用共现概率比也可以很好的体现3个单词间的关联(因为共现概率比符合常理),所以glove作者就大胆猜想,如果能将3个单词的词向量经过某种计算可以表达共现概率比就好了(glove思想)。如果可以的话,那么这样的词向量就与共现矩阵有着一致性,可以体现词间的关系。

    3. 设计词向量函数

      想要表达共现概率比,这里涉及到的有三个词即 i , j , k i,j,k i,j,k,它们对应的词向量我用 v i 、 v j 、 v ~ k v_i、v_j、\widetilde{v}_k vivjv k表示,那么我们需要找到一个映射 f f f,使得 f ( v i , v j , v ~ k ) = P i k P j k f(v_i,v_j,\widetilde{v}_k)={P_{ik}\over P_{jk}} f(vi,vj,v k)=PjkPik (1)。前面我说过,任意两个词的共现概率可以用语料库事先统计计算得到,那这里的给定三个词,是不是也可以确定共现概率比啊。这个比值可以作为标签,我们可以设计一个模型通过训练的方式让映射值逼近这个确定的共现概率比。很明显这是个回归问题,我们可以用均方误差作为 l o s s loss loss。明显地,设计这个函数或者这个模型当然有很多途径,我们来看看作者是怎么设计的。
      我们可以发现公式(1)等号右侧结果是个标量,左边是个关于向量的函数,如何将函数变成标量。于是作者这么设计: f ( ( v i − v j ) T v ~ k ) = P i k P j k f((v_i-v_j)^T\widetilde{v}_k)={P_{ik}\over P_{jk}} f((vivj)Tv k)=PjkPik (2)即向量做差再点积再映射到目标。再次强调,这只是一种设计,它可能不是那么严谨,合理就行。于是乎:
    在这里插入图片描述
      于是,glove模型的学习策略就是通过将词对儿的词向量经过内积操作和平移变换去趋于词对儿共现次数的对数值,这是一个回归问题。于是作者这样设计损失函数: J = ∑ i = 1 N ∑ j = 1 N f ( x i j ) ( v i T v ~ j + b i + b j − l o g ( x i j ) ) 2 J=\sum_{i=1}^{N}\sum_{j=1}^{N}f(x_{ij})(v_i^T\widetilde{v}_j+b_i+b_j-log(x_{ij}))^2 J=i=1Nj=1Nf(xij)(viTv j+bi+bjlog(xij))2
      这里用的是误差平方和作为损失值,其中N表示语料库词典单词数。它这里在误差平方前给了一个权重函数 f ( x i j ) f(x_{ij}) f(xij),这个权重是用来控制不同大小的共现次数( x i j x_{ij} xij)对结果的影响的。作者是这么设计这个权重函数的:
    权重函数
    在这里插入图片描述
      也就是说词对儿共现次数越多的它有更大的权重将被惩罚得更厉害些,次数少的有更小的权重,这样就可以使得不常共现的词对儿对结果的贡献不会太小,而不会过分偏向于常共现的词对儿。此外,当 x i j x_{ij} xij=0时,加入了这个权重函数此时该训练样本的损失直接为0,从而避免了 l o g ( x i j ) log(x_{ij}) log(xij)为无穷小导致损失值无穷大的问题。

    4. GloVe模型算法

      最后,关于glove模型算法,大致是这样的:从共现矩阵中随机采集一批非零词对作为一个mini-batch的训练数据;随机初始化这些训练数据的词向量以及随机初始化两个偏置;然后进行内积和平移操作并与 l o g ( x i j ) log(x_{ij}) log(xij)计算损失值,计算梯度值;然后反向传播更新词向量和两个偏置;循环以上过程直到结束条件。论文中还提到一个词最终的glove词向量用的是训练后的两个词向量之和,关于这一点论文中有解释,如果感兴趣的话最好阅读一下原论文。

    reference:
    [1] 来b站搞学习
    [2] https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1184/lectures/midterm-review.pdf
    [3] GloVe论文
    [4] glove开源代码

    展开全文
  • 经典词向量模型总结

    千次阅读 2019-04-01 17:40:22
    目录 一.Word2vec 二、GloVe ...Word2Vec主要有skip-gram和CBOW两种模型。skip-gram是给定input word来预测上下文,比较适合用于大规模的数据集上。cbow是给定上下文,来预测input word,比较...
  • 在空间向量模型的基础上提出了一种同时考虑句子结构和语义信息的关系向量模型,这种模型考虑了组成句子的关键词之间的搭配关系和关键词的同义信息,这些信息反应了句子的局部结构成分以及各局部之间的关联关系,因此...
  • 向量模型(word2vec) 详解

    千次阅读 多人点赞 2019-01-16 12:49:28
    觉得挺有意思,于是做了一个实现(可参见[20]),但苦于其中字向量的训练时间太长,便选择使用 word2vec 来提供字向量,没想到中文分词效果还不错,立马对 word2vec 刮目相看了一把,好奇心也随之增长。 后来,...
  • 词袋模型和词向量模型

    万次阅读 多人点赞 2016-06-05 19:47:44
    本文简要介绍了词袋模型、词向量模型的原理和应用。
  • 训练自己的词向量模型

    千次阅读 2019-03-15 15:55:36
    from:... 一、gensim介绍 gensim是一款强大的自然语言处理工具,里面包括N多常见模型: - 基本的语料处理工具 - LSI - LDA - HDP - DTM - DIM - TF-IDF - word2vec、paragraph2vec...
  • 弹性搜索 向量空间模型,使用ES作为索引器的语言模型
  • 提出了一种基于类向量模型的中文姓名识别方法。该方法通过类向量的生成来模拟人工识别姓名的过程,采用Viterbi算法对未经切分的汉字串进行类向量标注得到类向量序列,通过检查相邻类向量中类别和向量分量的变化来...
  • 本文作者:合肥工业大学 管理学院 钱洋 email:... 未经本人允许禁止转载。论文来源Nguyen D Q, Billingsley R, Du L, et al. Improving topic models with latent feature word representations[J]. Transactions of
  • 【NLP】⚠️学不会打我! 半小时学会基本操作 2⚠️词向量模型简介
  • 利用Python构建Wiki中文语料词向量模型试验
  • 把训练好的词向量模型可视化

    千次阅读 2020-02-19 23:29:14
    意思相近的词语,在向量空间中的距离应该越近...输入是一个训练好的词向量模型。输出是一张图片,把每个词都标记在上面。 from gensim.models import Word2Vec from random import sample from pylab import mpl mod...
  • Word2Vec词向量模型代码

    千次阅读 2018-08-31 15:01:27
    Word2Vec也称Word Embedding,中文的叫法是“词向量”或“词嵌入”,是一种计算非常高效的,可以从原始语料中学习字词空间向量的预测模型。Word2Vec可以把一个维数为所有词的数量的高维空间嵌入到一个低维的连续向量...
  • 一、词袋模型 将所有词语装进一个袋子里,不考虑其词法和语序的问题,即每个词语都是独立的。例如上面2个例句,就可以构成一个词袋,袋子里包括Jane、wants、to、go、Shenzhen、Bob、Shanghai。假设建立一个数组...
  • 使用gensim框架及Word2Vec词向量模型获取相似词预备知识Word2Vec模型下载加载词向量模型 预备知识 gensim框架 gensim是基于Python的一个框架,它不但将Python与Word2Vec做了整合,还提供了基于LSA、LDA、HDP的主体...
  • 利用gensim包的word2vec模块构建CBOW或Skip-Gram模型来进行词向量化比较方便。 ''' 根据训练语料库,自己训练语言模型得到词向量 ''' # 对分词后的文本训练Word2vec模型 from gensim.models import word2vec import ...
  • 由于平时会用到很多的文本预处理,这里就系统的讲解一下Gensim是如何训练维基百科词向量模型的!! 其中训练好的模型,也就是最终生成的 **.model 文件,可以作为预训练词向量使用。 训练维基百科词向量模型的代码...
  • 根据徐老师最新讲解论文使用的四种公开语言模型 ,经过本人上网查找,现将各预训练好的模型下载地址整合如下: Global Vectors(GloVe):2014年, 1*300dim glove.840B.300d.txt:2196017个单词 fastText:crawl-...
  •   本篇主要是基于gensim 库中的 Word2Vec 模型,使用维基百科中文数据训练word2vec 词向量模型,大体步骤如下: 数据预处理 模型的训练 模型的测试 准备条件: Windows10 64位 Python3.6,并安装 gensim 库:...
  • 空间向量模型和tf-idf

    千次阅读 2017-09-21 16:56:00
    向量空间模型 向量空间模型是一个把文本文件表示为标识符(比如索引)向量的代数模型,它应用于信息过滤、信息检索、索引以及相关排序。 1 定义 文档和查询都用向量来表示: 每一维都对应于一个个别的词组。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 296,861
精华内容 118,744
关键字:

向量模型