博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
doc2vec使用说明(二)gensim工具包 LabeledSentence
阅读量:6360 次
发布时间:2019-06-23

本文共 4047 字,大约阅读时间需要 13 分钟。

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

本文介绍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, loggingimport osfrom gensim.models.doc2vec import Doc2Vec,LabeledSentencefrom gensim.models import Doc2Vecimport gensim.models.doc2vecasin=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 lineprint 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, loggingimport osfrom gensim.models.doc2vec import Doc2Vec,LabeledSentencefrom gensim.models import Doc2Vecimport gensim.models.doc2vecasin=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

转载于:https://www.cnblogs.com/baiting/p/5874994.html

你可能感兴趣的文章
git pull遇到的问题
查看>>
eclipse下maven spring项目环境配置
查看>>
无缝轮播
查看>>
CTS失败项分析(2)android.telephony.cts.VisualVoicemailServiceTest#testFilter_data
查看>>
三分钟,轻松了解Dapp
查看>>
GMQ交易平台满足不同客户群体的多种投资需求
查看>>
大数据开发如何入门你必须知道这些
查看>>
关于js(es5)如何优雅地创建对象
查看>>
阿里云前端周刊 - 第 28 期
查看>>
iOS 主队列同步造成死锁的原因
查看>>
es6 下比较对象是否有修改的简要方法
查看>>
windows安装mysql
查看>>
你还在看《深入理解Java虚拟机》的运行时数据模型吗?
查看>>
RIS,创建 React 应用的新选择
查看>>
线性结构上的动态规划--算法竞赛入门经典笔记
查看>>
面试官:你使用webpack时手写过loader,分离过模块吗?
查看>>
Ubuntu 16.04系统下 对OpenJDK编译好的Hotspot 进行调试
查看>>
00-利用思维导图梳理JavaSE基础知识-持续更新中!
查看>>
java中三种注释及其实际应用的意义
查看>>
【三石jQuery视频教程】01.图片循环展示
查看>>