欢迎交流,转载请注明出处。

本文介绍gensim工具包中,带标签(一个或者多个)的文档的doc2vec 的向量表示。

应用场景: 当每个文档不仅可以由文本信息表示,还有别的其他标签信息时,比如,在商品推荐中,将每个商品看成是一个文档,我们想学习商品向量表示时,可以只使用商品的描述信息来学习商品的向量表示,但有时:商品类别等信息我们也想将其考虑进去, 最简单的方法是:当用文本信息学习到商品向量后,添加一维商品的类别信息,但只用一维来表示商品类别信息的有效性差。gensim 工具包的doc2vec提供了更加合理的方法,将商品标签(如类别)加入到商品向量的训练中,即gensim 中的LabeledSentence方法

LabeledSentence的输入文件格式:每一行为:<labels, words>, 其中labels 可以有多个,用tab 键分隔,words 用空格键分隔,eg:<id  category  I like my cat demon>.

输出为词典vocabuary 中每个词的向量表示,这样就可以将商品labels:id,类别的向量拼接用作商品的向量表示。

写了个例子,仅供参考(训练一定要加 min_count=1,否则词典不全,这个小问题卡了一天 Doc2Vec(sentences, size = 100, window = 5, min_count=1))

注意:下面的例子是gensim更新之前的用法,gensim更新之后,没有了labels 的属性,换为tags, 且目标向量的表示也由vacb转到docvecs 中。更新后gensim 的用法见例子2.

例子1:gensim 更新前。

 # -*- coding: UTF-8 -*-
import gensim, logging
import os
from gensim.models.doc2vec import Doc2Vec,LabeledSentence
from gensim.models import Doc2Vec
import gensim.models.doc2vec asin=set()
category=set()
class LabeledLineSentence(object):
def __init__(self, filename=object):
self.filename =filename
def __iter__(self):
with open(self.filename,'r') as infile:
data=infile.readlines();
# print "length: ", len(data)
for uid,line in enumerate(data):
asin.add(line.split("\t")[0])
category.add(line.split("\t")[1])
yield LabeledSentence(words=line.split("\t")[2].split(), labels=[line.split("\t")[0],line.split("\t")[1]])
print 'success' logging.basicConfig(format = '%(asctime)s : %(levelname)s : %(message)s', level = logging.INFO)
sentences =LabeledLineSentence('product_bpr_train.txt')
model = Doc2Vec(sentences, size = 100, window = 5, min_count=1)
model.save('product_bpr_model.txt')
print 'success1' #for uid,line in enumerate(model.vocab):
# print line
print len(model.vocab)
outid = file('product_bpr_id_vector.txt', 'w')
outcate = file('product_bpr_cate_vector.txt', 'w')
for idx, line in enumerate(model.vocab):
if line in asin :
outid.write(line +'\t')
for idx,lv in enumerate(model[line]):
outid.write(str(lv)+" ")
outid.write('\n')
if line in category:
outcate.write(line + '\t')
for idx,lv in enumerate(model[line]):
outcate.write(str(lv)+" ")
outcate.write('\n')
outid.close()
outcate.close()

 例子2:gensim 更新后

 # -*- coding: UTF-8 -*-
import gensim, logging
import os
from gensim.models.doc2vec import Doc2Vec,LabeledSentence
from gensim.models import Doc2Vec
import gensim.models.doc2vec asin=set()
category=set()
class LabeledLineSentence(object):
def __init__(self, filename=object):
self.filename =filename
def __iter__(self):
with open(self.filename,'r') as infile:
data=infile.readlines();
print "length: ", len(data)
for uid,line in enumerate(data):
print "line:",line
asin.add(line.split("\t")[0])
print "asin: ",asin
category.add(line.split("\t")[1])
yield LabeledSentence(words=line.split("\t")[2].split(" "), tags=[line.split("\t")[0], line.split("\t")[1]])
print 'success' logging.basicConfig(format = '%(asctime)s : %(levelname)s : %(message)s', level = logging.INFO)
sentences =LabeledLineSentence('product_bpr_test_train.txt')
model = Doc2Vec(sentences, size =50, window = 5, min_count=1)
model.save('product_bpr_model50.txt')
print 'success1' print "doc2vecs length:", len(model.docvecs)
outid = file('product_bpr_id_vector50.txt', 'w')
outcate = file('product_bpr_cate_vector50.txt', 'w')
for id in asin:
outid.write(id+"\t")
for idx,lv in enumerate(model.docvecs[id]):
outid.write(str(lv)+" ")
outid.write("\n")
for cate in category:
outcate.write(cate + '\t')
for idx,lv in enumerate(model.docvecs[cate]):
outcate.write(str(lv)+" ")
outcate.write('\n')
outid.close()
outcate.close()

参考:

http://rare-technologies.com/doc2vec-tutorial/

https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-IMDB.ipynb

http://radimrehurek.com/gensim/models/doc2vec.html#blog

doc2vec使用说明(二)gensim工具包 LabeledSentence的更多相关文章

  1. doc2vec使用说明(一)gensim工具包TaggedLineDocument

    gensim 是处理文本的很强大的工具包,基于python环境下: 1.gensim可以做什么? 它可以完成的任务,参加gensim 主页API中给出的介绍,链接如下: http://radimreh ...

  2. word2vec使用说明(google工具包)

    word2vec使用说明   转自:http://jacoxu.com/?p=1084. Google的word2vec官网:https://code.google.com/p/word2vec/ 下 ...

  3. UE4.5.0的Kinect插件(Plugin)---插件使用说明<二>

    声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/43563959 一.起因: 写了个UE4的Kinect的插件,结 ...

  4. Neo4j 的使用说明(二)

    上一篇: https://www.cnblogs.com/infoo/p/9840965.html  阅读量挺多的,因此继续写一下(二) 在上一篇说到:(版本依然基于V3.4.9) 如果为了方便更改d ...

  5. Hawk 数据抓取工具 使用说明(二)

    1. 调试模式和执行模式 1.1.调试模式 系统能够通过拖拽构造工作流.在编辑流的过程中,处于调试模式,为了保证快速地计算和显示当前结果(只显示前20个数据,可在调试的采样量中修改),此时,所有执行器 ...

  6. Gensim进阶教程:训练word2vec与doc2vec模型

    本篇博客是Gensim的进阶教程,主要介绍用于词向量建模的word2vec模型和用于长文本向量建模的doc2vec模型在Gensim中的实现. Word2vec Word2vec并不是一个模型--它其 ...

  7. [Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型

    深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢? ...

  8. models.doc2vec – Deep learning with paragraph2vec

    参考: 用 Doc2Vec 得到文档/段落/句子的向量表达 https://radimrehurek.com/gensim/models/doc2vec.html Gensim Doc2vec Tut ...

  9. 基于Doc2vec训练句子向量

    目录 一.Doc2vec原理 二.代码实现 三.总结   一.Doc2vec原理 前文总结了Word2vec训练词向量的细节,讲解了一个词是如何通过word2vec模型训练出唯一的向量来表示的.那接着 ...

随机推荐

  1. 使用React制作一个可配置的页面生成器[0]

    背景 上班两年多,终于来到一家互联网公司,告别之前的朝九晚六的腐败生活,开始了11116的码农之旅. 因为公司做的是直播相关的业务,所以伴随着直播,不定期的就会有运营活动-.- 但是这类活动留给码农的 ...

  2. jquery编写插件的方法

     版权声明:作者原创,转载请注明出处! 编写插件的两种方式: 1.类级别开发插件(1%) 2.对象级别开发(99%) 类级别的静态开发就是给jquery添加静态方法,三种方式 1.添加新的全局函数 2 ...

  3. 自定义View字段表头

    适用场景: 三个列表进行Join,然后试图上显示ProjectedField,而ProjectedField不支持设置DisplayName.默认只能显示英文名. join caml如下: <V ...

  4. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q135-Q137)

    Question  135 You work for a software company that sells Web Parts to customers. You designed the fi ...

  5. Android开发学习——android体系结构

    Android的体系结构采用了分层架构的思想, 从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核. 一 应用程序层 该层提供一些核心应用程序包,例 ...

  6. Java Web中请求转发和请求包含

    1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...

  7. IOS开发基础知识--碎片20

    1:view中的clipsTobounds属性 iew2添加view1到中,如果view2大于view1,或者view2的坐标不全在view1的范围内,view2是盖着view1的,意思就是超出的部份 ...

  8. [Erlang 0106] Erlang实现Apple Push Notifications消息推送

        我们的IOS移动应用要实现消息推送,告诉用户有多少条消息未读,类似下图的效果(笑果),特把APNS和Erlang相关解决方案笔记于此备忘.          上面图片中是Apple Notif ...

  9. linux ssh和scp实例

    ssh 192.160.1.100 -p 40012 scp user 192.169.72.2:/ scp -i /id_rsa -P40027 root@221.212.235.17:/sdzw/ ...

  10. 2016 最佳 Linux 发行版排行榜

    2015年,不管在企业市场还是个人消费市场都是 Linux非常重要的一年.作为一个自2005年起就开始使用 Linux的 Linuxer ,我门见证了 Linux在过去十年的成长.2016 Linux ...