word2vec、doc2vec的使用

本文深入探讨了word2vec的原理,包括Hierarchical Softmax和Negative Sampling,以及如何初始化模型。同时介绍了gensim库在word2vec和doc2vec中的应用,展示了如何加载模型、计算相似度、训练和评估。doc2vec部分讲解了DM和DBOW模型,并分享了语料处理和训练的实践方法。
摘要由CSDN通过智能技术生成

一、word2vec原理

《个人的总结》:
1、因为直接使用softmax进行预测,对于分类数过大的时候,速度太慢,所以拆分成多个二分类Hierarchical Softmax。
2、使用层次化的softmax方法预测:cbow与skip-gram都是在一幅图上跑的,对于每个类别,它在图上就指定好一条路线。然后从映射层中得到一个向量,让这个向量跑这条路线,就能得到一个序列,有了这个预测序列和原序列(路线),就能计算交叉熵损失了。对交叉熵求偏导,利用梯度下降法,就能更新该路线上的非叶子结点的参数,以及更新映射层传来的向量。
3、分析树形图:
非叶子结点(根结点)权重参数的意义:因为多分类的需要设定的,可以得到逐层概率的序列,再加上原目标序列,于是可以用交叉熵了。
叶子结点的意义:只是代表路线结束,没有参数。
4、在用negative samping 处理skip-gram 模型时,原作者改变了损失函数。实际变成了多个预测一个的CBOW,只是映射层不进行累加了,理由如下:
(1)为w取了|Context(w)|次负采样【本应该是为每个Context(w)的词语负采样一次的】。
(2)更新时,不更新w,而是更新Context(w)的一个。
(3)与中间节点进行相乘的向量,居然是一个Context(w)向量,而不是w。
5、基于层次化softmax预测的cbow模型:
(1)我这边觉得孙老师的论文,不应该重新建立一个用层次softmax预测的cbow模型。这是因为所有的词向量信息都存在非叶子结点处了,而孙老师想“包袱”词的义原更好预测“包袱”,则必须也要基于原预测模型,否则新建层次softmax树会失去原词向量的信息。
(2)总的来说,就是表达:层次化softmax的cbow模型树,词向量信息隐藏在非叶子结点中。如果建立新树,将会抛弃原来的非叶子结点信息,即抛弃了原来的词向量信息。故,我觉得应该继续在第一次的cbow模型树上进行修正。
(3)假如按照我的理解:非叶子结点隐藏有词向量的信息。那样子反观孙老师的论文提到的:“cbow模型会同步更新上下文词向量和词向量。“而他的方案是固定词向量,只改变义原向量。
等价于:softmax层次树中,只更新输入层向量,不更新中间结点词向量。(今天下午,我们看的伪代码,就是只更新这两种向量嘛。)
他这样的原理就是:预测模型(softmax层次树)不变,只修正输入层(义原向量)。
(4)因为非叶子结点作分类(0、1类)的功能,所以它能知道,当前输入的向量想找哪个目标词(实际就是告诉它走哪边)。于是我表达说“非叶子结点是有隐性的词向量”。

实现细节

参考1 参考2
两个模型:CBOW、Skip-gram。
因为softmax复杂度太大,所以提出两种近似学习方法:Hierarchical Softmax、Negative Sampling。
w2v也必须建立图,才能理解好,不然你处理不了的。

如何初始化?

Negative-Sampling(NEG)基于skip-gram模型,但实际上是优化另一个目标函数。

softmax 避免数值过大的办法

参考来源

二、gensim的官方总启api

参考来源
w2v的使用:
1、加载模型。
vectormodel = ‘wiki.zh.text.model’ # 模型文件
model = gensim.models.Word2Vec.load(vectormodel) # 导入训练集
2、找相似度最高的词。
result = model.most_similar(u”计算机”,topn=50000)# topn是返回最相似的个数,默认返回10个。
for e in result:
print e[0], e[1]# 输出:自动化 0.674171924591
3、计算两次的相似度
print model.similarity(u”计算机”, u”自动化”)# 输出:0.67417196002404789
4、在一堆词的找出最不相关的词。
print model.doesnt_match(u”早餐 晚餐 午餐 中心”.split())# 输出:中心
5、查模型中全部的词。

tmp = model.vocab
print type(tmp)# 输出:<type 'builtin_function_or_method'>
print len(tmp)# 4G微博语料是:1077923个词。
for v in tmp:
    print v

6、输出400维的词向量

v = u"男人"
model[v]  # 输出的是400位的向量,本来就是:np.array型,浮点数。

7、应该是unicode码 我平时训练出来的模型才能识别

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值