基于gensim的Doc2Vec简析,以及用python 实现简要代码

Doc2Vec 原理:

Doc2Vec 或者叫做 paragraph2vec, sentence embeddings,是一种非监督式算法,可以获得sentences/paragraphs/documents 的向量表达,是 word2vec 的拓展。学出来的向量可以通过计算距离来找 sentences/paragraphs/documents 之间的相似性, 或者进一步可以给文档打标签。

例如首先是找到一个向量可以代表文档的意思, 然后可以将向量投入到监督式机器学习算法中得到文档的标签, 例如在**情感分析 **sentiment analysis 任务中,标签可以是 “negative”, “neutral”,”positive”

两种实现方法

2013 年 Mikolov 提出了 word2vec 来学习单词的向量表示, 主要有两种方法,cbow ( continuous bag of words) 和 skip-gram , 一个是用语境来预测目标单词,另一个是用中心单词来预测语境。

既然可以将 word 表示成向量形式,那么句子/段落/文档是否也可以只用一个向量表示?

一种方式是可以先得到 word 的向量表示,然后用一个简单的平均来代表文档。 另外就是 Mikolov 在 2014 提出的 Doc2Vec。

Doc2Vec 也有两种方法来实现。

dbow (distributed bag of words)

python gensim 实现:

model = gensim.models.Doc2Vec(documents,dm = 0, alpha=0.1, size= 20, min_alpha=0.025)

dm (distributed memory)

gensim 实现:

model = gensim.models.Doc2Vec(documents,dm = 1, alpha=0.1, size= 20, min_alpha=0.025)

二者在 gensim 实现时的区别是 dm = 0 还是 1.

Doc2Vec 的目的是获得文档的一个固定长度的向量表达。

数据:多个文档,以及它们的标签,可以用标题作为标签。 影响模型准确率的因素:语料的大小,文档的数量,越多越高;文档的相似性,越相似越好。

这里要用到 Gensim 的 Doc2Vec:

import gensim
LabeledSentence = gensim.models.doc2vec.LabeledSentence
先把所有文档的路径存进一个 array 中,docLabels:
from os import listdir
from os.path import isfile, join
docLabels = []
docLabels = [f for f in listdir("myDirPath") if f.endswith('.txt')]

把所有文档的内容存入到 data 中:

data = []
for doc in docLabels:
    data.append(open(“myDirPath/” + doc, ‘r’)

接下来准备数据, 如果是用句子集合来训练模型,则可以用:

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])

如果是用文档集合来训练模型,则用:

class LabeledLineSentence(object):
    def __init__(self, doc_list, labels_list):
       self.labels_list = labels_list
       self.doc_list = doc_list
    def __iter__(self):
        for idx, doc in enumerate(self.doc_list):
            yield LabeledSentence(words=doc.split(),labels=[self.labels_list[idx]])

在 gensim 中模型是以单词为单位训练的,所以不管是句子还是文档都分解成单词。

训练模型: 将 data, docLabels 传入到 LabeledLineSentence 中, 训练 Doc2Vec,并保存模型:

it = LabeledLineSentence(data, docLabels)

model = gensim.models.Doc2Vec(size=300, window=10, min_count=5, workers=11,alpha=0.025, min_alpha=0.025)

model.build_vocab(it)

for epoch in range(10):
    model.train(it)
    model.alpha -= 0.002            # decrease the learning rate
    model.min_alpha = model.alpha       # fix the learning rate, no deca
    model.train(it)

model.save(“doc2vec.model”)

测试模型: Gensim 中有内置的 most_similar:

print model.most_similar(“documentFileNameInYourDataFolder”)

输出向量:

model[“documentFileNameInYourDataFolder”]

得到向量后,可以计算相似性,输入给机器学习算法做情感分类等任务了。

附相关名词解释: 训练集:学习样本数据集,通过匹配一些参数来建立一个分类器。建立一种分类的方式,主要是用来训练模型的。

验证集:对学习出来的模型,微调分类器的参数,如在神经网络中选择隐藏单元数。验证集还用来确定网络结构或者控制模型复杂程度的参数。

测试集:主要用于测试训练好的模型的分类能力(识别率等)

显然,training set是用来训练模型或确定模型参数的,如ANN中权值等; validation set是用来做模型选择(model selection),即做模型的最终优化及确定的,如ANN的结构;而 test set则纯粹是为了测试已经训练好的模型的推广能力。

但实际应用中,一般只将数据集分成两类,即training set 和test set,大多数文章并不涉及validation set。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ATYUN订阅号

【学术】如何在神经网络中选择正确的激活函数

在神经网络中,激活函数是必须选择的众多参数之一,以通过神经网络获得最优的成果和性能。 在这篇文章中,我将假设你已经理解了神经网络工作的基本原理,并将详细介绍涉及...

360100
来自专栏智能算法

三个臭皮匠顶个诸葛亮的随机森林算法!

随机森林一个已被证明了的成功的集成分类器,特别是用在多维分类问题上更是体现出其强大之处。一个随机森林是一个决策树的集合,可以看作是一个分类器包括很多不同的决策...

438120
来自专栏杨熹的专栏

Logistic Regression 为什么用极大似然函数

49320
来自专栏专知

【计算机视觉】检测与分割详解

【导读】神经网络在计算机视觉领域有着广泛的应用。只要稍加变形,同样的工具和技术就可以有效地应用于广泛的任务。在本文中,我们将介绍其中的几个应用程序和方法,包括语...

16630
来自专栏Brian

深度学习笔记-神经网络基础

---- Binary Classification logistic是一个用于二元分类的算法,所谓二元分类就是该预测结果只有两种类别。比如:预测图片中的是不是...

38990
来自专栏企鹅号快讯

几种循环神经网络介绍

基于图展开和参数共享的思想,我们可以设计各种循环神经网络。 ? 计算循环网络(将 x值的输入序列映射到输出值 o 的对应序列) 训练损失的计算图。损失L 衡量每...

38990
来自专栏机器学习算法工程师

【DLND 机器学习算法全栈工程师】干货!小白也能看懂的神经网络入门

导语: 干货来了,Udacity Machine Learning 课程导师 Walker 亲自出马,教你简单形象有趣地掌握神经网络! 神经网络是什么?神经网络...

37750
来自专栏PaddlePaddle

卷积神经网络的基本结构

深度学习基础理论-CNN篇 卷积神经网络的基本结构 ? 总体来说,卷积神经网络是一种层次模型(hierarchical model),其输入是原始数据(ra...

446130
来自专栏人人都是极客

Peter教你谈情说AI | 07决策树(上)—既能回归又能分类的模型

前面我们讲了线性回归模型和朴素贝叶斯分类模型。前者只能做回归,后者只能做分类。但本文中要讲的决策树模型,却既可以用于回归,又可以用于分类。

13730
来自专栏YoungGy

记忆网络RNN、LSTM与GRU

RNN 结构 训练 应用 RNN Variants LSTM 结构 梯度消失及梯度爆炸 GRU 结构 ? 一般的神经网络输入和输出的维度大小都是固定的,针对序列...

400100

扫码关注云+社区

领取腾讯云代金券