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

本文介绍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. 学习zepto.js(对象方法)[2]

    今天来说下zepto那一套dom操作方法, prepend,append,prependTo,appendTo,before,after,insertBefore,insertAfter; 按着从内到 ...

  2. Android Fragment使用(一) 基础篇 温故知新

    Fragment使用的基本知识点总结, 包括Fragment的添加, 参数传递和通信, 生命周期和各种操作. Fragment使用基础 Fragment添加 方法一: 布局里的标签 标识符: tag, ...

  3. 学习Maven之Properties Maven Plugin

    1.properties-maven-plugin是个什么鬼? 介绍前我们先看一个问题,比如我们有一个maven项目结构如下: 一般我们都把一些配置文件放到像src/main/resources/jd ...

  4. nodejs 中自定义事件

    经常看到 req.on('error', function(){...}); 这种代码. 在nodejs中,可以使用 EventEmitter来实现. 具体的关键词有如下几个: var reqEven ...

  5. ORACLE NUMBER类型Scale为0引发的问题

    今天遇到了一个很有意思的NUMBER类型Scale引发的问题,我用一个简单的测试用例来展示一下这个案例.假如有个TEST的表,有个字段类型为NUMBER,我插入下面两条数据 CREATE TABLE ...

  6. flume:spooldir采集日志,kafka输出的配置问题

    flume配置: #DBFile DBFile.sources = sources1 DBFile.sinks = sinks1 DBFile.channels = channels1 # DBFil ...

  7. 关于linx中man命令内容中第一行数字的含义

    我们知道linux中man这玩意特别厉害,我们要查么个命令的使用方法.如man ls 出现如下内容 关于这写数字的含义如下表格

  8. ubuntu下安装lrzsz

    secureCRT中可以使用rz和sz命令上传和下载文件,可是这要linux中安装了lrzsz才可以.我用的时候无法使用apt-get自动安装,下面介绍手动安装的方法. 1 下载lrzsz软件  ht ...

  9. 淘宝技术牛p博客整理

    淘宝的技术牛人的博客http://blog.csdn.net/zdp072/article/details/19574793

  10. 数据分析:.Net程序员该如何选择?

    上文我介绍了用.Net实现的拉勾爬虫,可全站采集,其中.Net和C#(不区分)的数据爬取开始的早,全国主要城市都有一定数量的分布,加上有了近期其他相似技术类别的数据进行横向比较,可以得到比较合理的推测 ...