Gensim进阶教程:训练word2vec与doc2vec模型
2017-05-24 14:49
381 查看
转自:公子天的技术博客http://www.cnblogs.com/iloveai/
本篇博客是Gensim的进阶教程,主要介绍用于词向量建模的word2vec模型和用于长文本向量建模的doc2vec模型在Gensim中的实现。
在Gensim中实现word2vec模型非常简单。首先,我们需要将原始的训练语料转化成一个sentence的迭代器;每一次迭代返回的sentence是一个word(utf8格式)的列表:
接下来,我们用这个迭代器作为输入,构造一个Gensim内建的word2vec模型的对象(即将原始的one-hot向量转化为word2vec向量):
如此,便完成了一个word2vec模型的训练。
我们也可以指定模型训练的参数,例如采用的模型(Skip-gram或是CBoW);负采样的个数;embedding向量的维度等。具体的参数列表在这里
同样,我们也可以通过调用
Word2vec对象还支持online learning。我们可以将更多的训练数据传递给一个已经训练好的word2vec对象,继续更新模型的参数:
若要查看某一个word对应的word2vec向量,可以将这个word作为索引传递给训练好的模型对象:
主要的区别是在对输入数据的预处理上。Doc2vec接受一个由LabeledSentence对象组成的迭代器作为其构造函数的输入参数。其中,LabeledSentence是Gensim内建的一个类,它接受两个List作为其初始化的参数:word list和label list。
类似地,可以构造一个迭代器对象,将原始的训练数据文本转化成LabeledSentence对象:
准备好训练数据,模型的训练便只是一行命令:
该代码将同时训练word和sentence label的语义向量。如果我们只想训练label向量,可以传入参数
注意,在目前版本的doc2vec实现中,每一个Sentence vector都是常驻内存的。因此,模型训练所需的内存大小同训练语料的大小正相关。
本篇博客是Gensim的进阶教程,主要介绍用于词向量建模的word2vec模型和用于长文本向量建模的doc2vec模型在Gensim中的实现。
Word2vec
Word2vec并不是一个模型——它其实是2013年Mikolov开源的一款用于计算词向量的工具。关于Word2vec更多的原理性的介绍,可以参见我的另一篇博客:word2vec前世今生在Gensim中实现word2vec模型非常简单。首先,我们需要将原始的训练语料转化成一个sentence的迭代器;每一次迭代返回的sentence是一个word(utf8格式)的列表:
class MySentences(object): def __init__(self, dirname): self.dirname = dirname def __iter__(self): for fname in os.listdir(self.dirname): for line in open(os.path.join(self.dirname, fname)): yield line.split() sentences = MySentences('/some/directory') # a memory-friendly iterator
接下来,我们用这个迭代器作为输入,构造一个Gensim内建的word2vec模型的对象(即将原始的one-hot向量转化为word2vec向量):
model = gensim.models.Word2Vec(sentences)
如此,便完成了一个word2vec模型的训练。
我们也可以指定模型训练的参数,例如采用的模型(Skip-gram或是CBoW);负采样的个数;embedding向量的维度等。具体的参数列表在这里
同样,我们也可以通过调用
save()和
load()方法完成word2vec模型的持久化。此外,word2vec对象也支持原始bin文件格式的读写。
Word2vec对象还支持online learning。我们可以将更多的训练数据传递给一个已经训练好的word2vec对象,继续更新模型的参数:
model = gensim.models.Word2Vec.load('/tmp/mymodel') model.train(more_sentences)
若要查看某一个word对应的word2vec向量,可以将这个word作为索引传递给训练好的模型对象:
model['computer'] # raw NumPy vector of a word
Doc2vec
Doc2vec是Mikolov在word2vec基础上提出的另一个用于计算长文本向量的工具。它的工作原理与word2vec极为相似——只是将长文本作为一个特殊的token id引入训练语料中。在Gensim中,doc2vec也是继承于word2vec的一个子类。因此,无论是API的参数接口还是调用文本向量的方式,doc2vec与word2vec都极为相似。主要的区别是在对输入数据的预处理上。Doc2vec接受一个由LabeledSentence对象组成的迭代器作为其构造函数的输入参数。其中,LabeledSentence是Gensim内建的一个类,它接受两个List作为其初始化的参数:word list和label list。
from gensim.models.doc2vec import LabeledSentence sentence = LabeledSentence(words=[u'some', u'words', u'here'], tags=[u'SENT_1'])
类似地,可以构造一个迭代器对象,将原始的训练数据文本转化成LabeledSentence对象:
class LabeledLineSentence(object): def __init__(self, filename): self.filename = filename def __iter__(self): for uid, line in enumerate(open(filename)): yield LabeledSentence(words=line.split(), labels=['SENT_%s' % uid])
准备好训练数据,模型的训练便只是一行命令:
from gensim.models import Doc2Vec model = Doc2Vec(dm=1, size=100, window=5, negative=5, hs=0, min_count=2, workers=4)
该代码将同时训练word和sentence label的语义向量。如果我们只想训练label向量,可以传入参数
train_words=False以固定词向量参数。更多参数的含义可以参见这里的API文档。
注意,在目前版本的doc2vec实现中,每一个Sentence vector都是常驻内存的。因此,模型训练所需的内存大小同训练语料的大小正相关。
相关文章推荐
- Gensim进阶教程:训练word2vec与doc2vec模型
- Gensim进阶教程:训练word2vec与doc2vec模型
- word2vec的应用----使用gensim来训练模型
- 【word2vec】之 训练模型结果的结构探究 模型改造 python gensim
- 关于Gensim的初次见面 和 Doc2vec 的模型训练
- 用word2vec训练文本摘要的词向量模型
- gensim加载word2vec训练结果(bin文件)并进行相似度实验
- word2vec实战:获取和预处理中文维基百科(Wikipedia)语料库,并训练成word2vec模型
- word2vec 用于训练数据,生成模型
- word2vec训练中文模型
- gensim实现python对word2vec的训练和计算
- Windows下安装python版的Word2Vec工具包gensim教程(基于Anaconda)
- word2vec训练中文模型
- Word2Vec教程 - Skip-Gram模型(原理)(CNN情感分析yoom例子三)
- python︱gensim训练word2vec及相关函数与功能理解
- gensim实现python对word2vec的训练和计算
- word2vec 之 Deep Learning in NLP (一)词向量和语言模型
- word2vec 入门(二)使用教程篇
- Word2vec 模型载入(tensorflow)
- windows10 训练word2vec 中文语料