基于gensim的doc2vec实践

article/2025/8/23 16:16:37

1.“句向量”简介

word2vec提供了高质量的词向量,并在一些任务中表现良好。
关于word2vec的原理可以参考这几篇论文:

  • https://arxiv.org/pdf/1310.4546.pdf
  • https://arxiv.org/pdf/1301.3781.pdf

关于如何使用第三方库gensim训练word2vec可以参考这篇博客

  • http://blog.csdn.net/john_xyz/article/details/54706807

尽管word2vec提供了高质量的词汇向量,仍然没有有效的方法将它们结合成一个高质量的文档向量。对于一个句子、文档或者说一个段落,怎么把这些数据投影到向量空间中,并具有丰富的语义表达呢?过去人们常常使用以下几种方法:

  • bag of words
  • LDA
  • average word vectors
  • tfidf-weighting word vectors

bag of words而言,有如下缺点:1.没有考虑到单词的顺序,2.忽略了单词的语义信息。因此这种方法对于短文本效果很差,对于长文本效果一般,通常在科研中用来做baseline。

average word vectors就是简单的对句子中的所有词向量取平均。是一种简单有效的方法,但缺点也是没有考虑到单词的顺序

tfidf-weighting word vectors是指对句子中的所有词向量根据tfidf权重加权求和,是常用的一种计算sentence embedding的方法,在某些问题上表现很好,相比于简单的对所有词向量求平均,考虑到了tfidf权重,因此句子中更重要的词占得比重就更大。但缺点也是没有考虑到单词的顺序

LDA模型当然就是计算出一片文档或者句子的主题分布。也常常用于文本分类任务,后面会专门写一篇文章介绍LDA模型和doc2vec的本质不同

2. doc2vec原理

doc2vec是google的两位大牛Quoc Le和Tomas Mikolov在2014年提出的,原始论文地址如下:https://cs.stanford.edu/~quocle/paragraph_vector.pdf

Doc2Vec 或者叫做 paragraph2vec, sentence embeddings,是一种非监督式算法,可以获得 sentences/paragraphs/documents 的向量表达,是 word2vec 的拓展。学出来的向量可以通过计算距离来找 sentences/paragraphs/documents 之间的相似性,可以用于文本聚类,对于有标签的数据,还可以用监督学习的方法进行文本分类,例如经典的情感分析问题。

在介绍doc2vec原理之前,先简单回顾下word2vec的原理

word2vec基本原理

熟悉word2vec的同学都知道,下图是学习词向量表达最经典的一幅图。在下图中,任务就是给定上下文,预测上下文的其他单词。
这里写图片描述

其中,每个单词都被映射到向量空间中,将上下文的词向量级联或者求和作为特征,预测句子中的下一个单词。一般地:给定如下训练单词序列 w1,w2,w3,...,wT w 1 , w 2 , w 3 , . . . , w T , 目标函数是

1TTkt=klogp(wt|wtk,...,wt+k) 1 T ∑ t = k T − k l o g p ( w t | w t − k , . . . , w t + k )

当然,预测的任务是一个多分类问题,分类器最后一层使用softmax,计算公式如下:
p(wt|wtk,...,wt+k)=eywtieyi p ( w t | w t − k , . . . , w t + k ) = e y w t ∑ i e y i

这里的每一个 yi y i 可以理解为预测出每个 word w o r d 的概率。因为在该任务中,每个词就可以看成一个类别。计算 yi y i 的公式如下:

y=b+Uh(wtk,...,wt+k;W) y = b + U h ( w t − k , . . . , w t + k ; W )

这里 U U b都是参数,h是将 wtk,...,wt+k w t − k , . . . , w t + k 级联或者求平均。
因为每个单词都是一类,所以类别众多,在计算softmax归一化的时候,效率很低。因此使用hierarical softmax加快计算速度,其实就是huffman树,这个不再赘述,有兴趣的同学可以看word2vec的paper。

doc2vec基本原理

1. A distributed memory model

训练句向量的方法和词向量的方法非常类似。训练词向量的核心思想就是说可以根据每个单词 wi w i 的上下文预测 wi w i ,也就是说上下文的单词对 wi w i 是有影响的。那么同理,可以用同样的方法训练doc2vec。例如对于一个句子 s: s : i want to drink water,如果要去预测句子中的单词want,那么不仅可以根据其他单词生成feature, 也可以根据其他单词和句子 s s 来生成feature进行预测。因此doc2vec的框架如下所示:
这里写图片描述

每个段落/句子都被映射到向量空间中,可以用矩阵D的一列来表示。每个单词同样被映射到向量空间,可以用矩阵 W W 的一列来表示。然后将段落向量和词向量级联或者求平均得到特征,预测句子中的下一个单词。

这个段落向量/句向量也可以认为是一个单词,它的作用相当于是上下文的记忆单元或者是这个段落的主题,所以我们一般叫这种训练方法为Distributed Memory Model of Paragraph Vectors(PV-DM)

在训练的时候我们固定上下文的长度,用滑动窗口的方法产生训练集。段落向量/句向量 在该上下文中共享。

总结doc2vec的过程, 主要有两步

  • 训练模型,在已知的训练数据中得到词向量W, softmax的参数 U U b,以及段落向量/句向量 D D
  • 推断过程(inference stage),对于新的段落,得到其向量表达。具体地,在矩阵D中添加更多的列,在固定 W W ,U, b b <script type="math/tex" id="MathJax-Element-130">b</script>的情况下,利用上述方法进行训练,使用梯度下降的方法得到新的D,从而得到新段落的向量表达

    2. Paragraph Vector without word ordering: Distributed bag of words

    还有一种训练方法是忽略输入的上下文,让模型去预测段落中的随机一个单词。就是在每次迭代的时候,从文本中采样得到一个窗口,再从这个窗口中随机采样一个单词作为预测任务,让模型去预测,输入就是段落向量。如下所示:

    ![此处输入图片的描述][3]

    我们称这种模型为 Distributed Bag of Words version of Paragraph Vector(PV-DBOW)

    在上述两种方法中,我们可以使用PV-DM或者PV-DBOW得到段落向量/句向量。对于大多数任务,PV-DM的方法表现很好,但我们也强烈推荐两种方法相结合。

    3. 基于gensim的doc2vec实践

    我们使用第三方库gensim进行doc2vec模型的训练

    # -*- coding: utf-8 -*-
    import sys
    import logging
    import os
    import gensim
    # 引入doc2vec
    from gensim.models import Doc2Vec
    curPath = os.path.abspath(os.path.dirname(__file__))
    rootPath = os.path.split(curPath)[0]
    sys.path.append(rootPath)
    from utilties import ko_title2words# 引入日志配置
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)# 加载数据
    documents = []
    # 使用count当做每个句子的“标签”,标签和每个句子是一一对应的
    count = 0
    with open('../data/titles/ko.video.corpus','r') as f:for line in f:title = unicode(line, 'utf-8')# 切词,返回的结果是列表类型words = ko_title2words(title)# 这里documents里的每个元素是二元组,具体可以查看函数文档documents.append(gensim.models.doc2vec.TaggedDocument(words, [str(count)]))count += 1if count % 10000 == 0:logging.info('{} has loaded...'.format(count))# 模型训练
    model = Doc2Vec(documents, dm=1, size=100, window=8, min_count=5, workers=4)
    # 保存模型
    model.save('models/ko_d2v.model')

    接下来看看训练好的模型可以做什么

    def test_doc2vec():# 加载模型model = doc2vec.Doc2Vec.load('models/ko_d2v.model')# 与标签‘0’最相似的print(model.docvecs.most_similar('0'))# 进行相关性比较print(model.docvecs.similarity('0','1'))# 输出标签为‘10’句子的向量print(model.docvecs['10'])# 也可以推断一个句向量(未出现在语料中)words = u"여기 나오는 팀 다 가슴"print(model.infer_vector(words.split()))# 也可以输出词向量print(model[u'가슴'])

    以上都是一些比较常见的用法,更多的用法请参考https://radimrehurek.com/gensim/models/doc2vec.html


http://chatgpt.dhexx.cn/article/aP7Jk17f.shtml

相关文章

Word2vec And Doc2vec - 文本向量化

word2vec 与 doc2vec的区别: 两者从字面意思上就可以大致判断出区别来&#xff0c;word2vec主要针对与单词&#xff0c;而doc2vec主要针对于文本&#xff1a; 顾名思义&#xff0c;Word2Vec是在单个单词上训练的&#xff0c;而Doc2vec是在可变长度的文本上训练的&#xff0c;因…

doc2vec原理

doc2vec和word2vec类似&#xff0c;Doc2vec也有两种训练方式&#xff0c;分别是Distributed Memory(DM) 和 Distributed Bag of Words(DBOW)。 DM 试图在给定上下文和段落向量的情况下预测单词的概率&#xff0c;与word2vec中CBOW类似&#xff0c;在一个句子或者文档的训练过程…

Doc2vec论文阅读及源码理解

《Distributed representationss of Sentences and Documents》 Quoc Le and Tomas Mikolov, 2014 文章目录 《Distributed representationss of Sentences and Documents》1. Distributed Memory Model of Paragraph Vectors (PV-DM).1.1 模型架构图1.2 相关代码阅读 2. Dist…

doc2vec介绍和实践

简介 与其他方法的比较 bag of words (BOW)&#xff1a;不会考虑词语出现的先后顺序。 Latent Dirichlet Allocation (LDA)&#xff1a;更偏向于从文中提取关键词和核心思想extracting topics/keywords out of texts&#xff0c;但是非常难调参数并且难以评价模型的好坏。 …

doc2vec java_word2vec和doc2vec

word2vec基本思想 通过训练每个词映射成k维实数向量(k一般为模型中的超参数)&#xff0c;通过词之间的距离来判断语义相似度。 word2vec采用一个三层的神经网络。 训练的时候按照词频将每个词语Huffman编码&#xff0c;词频越高的词语对应的编码越短。这三层的神经网络本身是对…

Doc2vec

目录 一&#xff1a;背景 二&#xff1a;基本原理 2.1:PV-DM 2.2:PV-DBOW 2.3:和word2vec区别 2.4:预测新文本的向量 三&#xff1a;代码实战 3.1:接口介绍 3.2:主要代码 一&#xff1a;背景 之前总结了Word2vec训练词向量的细节&#xff0c;讲解了一个词是如何通过wor…

关于doc2vec

原文地址&#xff1a;https://blog.csdn.net/john_xyz/article/details/79208564 1.“句向量”简介 word2vec提供了高质量的词向量&#xff0c;并在一些任务中表现良好。 关于word2vec的原理可以参考这几篇论文&#xff1a; https://arxiv.org/pdf/1310.4546.pdfhttps://arx…

doc2vec java_doc2vec

gensim 是处理文本的很强大的工具包&#xff0c;基于python环境下&#xff1a; 1.gensim可以做什么&#xff1f; 它可以完成的任务&#xff0c;参加gensim 主页API中给出的介绍&#xff0c;链接如下&#xff1a; http://radimrehurek.com/gensim/apiref.html 2.word2vec的使用 …

Doc2Vec的简介及应用(gensim)

作者:Gidi Shperber 在本文中&#xff0c;你将学习什么是doc2vec&#xff0c;它是如何构建的&#xff0c;它与word2vec有什么关系&#xff0c;你能用它做什么&#xff0c;并且没有复杂的数学公式。 介绍 文本文档的量化表示在机器学习中是一项具有挑战性的任务。很多应用都…

Doc2Vec模型介绍及使用

Doc2Vec模型 Doc2Vec模型 摘要背景段落向量 PV-DM模型PV-DBOW模型gensim实现Doc2Vec说明参考文献摘要 通过本文,你将了解到: Doc2Vec模型是如何产生的Doc2Vec模型细节Doc2Vec模型的特点Doc2Vec的使用及代码(gensim)背景 Doc2Vec模型的产生要从词向量表示(论文word2vec模型)开…

Doc2Vec - 计算文档之间的相似性

本文旨在向您介绍 Doc2Vec 模型&#xff0c;以及它在计算文档之间的相似性时如何提供帮助。 目录 前言 一、Word2Vec 1.Skip-Gram 2.Continuous Bag-of-Words (CBOW) 二、Doc2Vec 1.Distributed Memory version of Paragraph Vector (PV-DM) 2.Words version of Paragra…

Doc2Vec模型的介绍与gensim中Doc2Vec的使用

文章目录 一、Doc2Vec模型1 、PV-DM2 、PV-DBOW 二、gensim实现1、gensim实现Doc2Vec&#xff08;IMDB数据集&#xff09;2、gensim实现Doc2Vec&#xff08;中文数据集&#xff09; 三、总结四、程序编写时遇到的错误&#xff1a;gensim包中相关函数说明&#xff1a; 参考资料&…

如何自学游戏引擎的开发?

PS&#xff1a;题猪分得清游戏和游戏引擎的区别&#xff0c;所以各位答主不需要劳神解释两者的区别关系什么的了 PS&#xff1a;这里的游戏引擎暂时指图形模块&#xff0c;其他的声音&#xff0c;物理&#xff0c;网络&#xff0c;UI等等模块暂时不考虑 题猪一直自学编程&#…

游戏开发完整学习路线(各个版本都有)

来自&#xff1a;微浪科技 作者&#xff1a;若朝若曦 在软件开发中&#xff0c;游戏开发这个方向看起来目标很明确&#xff0c;但其实是个领域很广的方向&#xff0c;入门的时候如果得不到指点一二&#xff0c;很容易误入歧途&#xff0c;相反&#xff0c;如果走这条路之前能…

智力开发小游戏集含游戏过程中数据存取-C#入门教学程序

对于初学C#程序开发的学员&#xff0c;一般进行采取开发小游戏程序&#xff0c;这样做首先不会让学员失去学习的兴趣&#xff0c;其次可以将C#中基本的控件与类的写法整合到这些游戏程序中&#xff0c;再次将对数据库的操作也教给学员。通过几年的观察这样的教学有它的好处。所…

游戏开发所需要的知识

从放弃求职回家已经一个半月了&#xff0c;一直都在备考事业编。发现这玩意比游戏开发简单太多了&#xff0c;没有人刁难&#xff0c;没有人催促&#xff0c;几个月举办一次&#xff0c;一天只需要学习3-4个小时&#xff0c;其余时间都是自由安排&#xff0c;太舒服了。考上编后…

零基础游戏开发笔记1——游戏开发流程

万事开头难&#xff0c;多学多练习&#xff0c;熟悉游戏开发的主要流程&#xff0c;莫要强行记忆。 首先&#xff0c;我们来了解一下游戏的开发流程。 第一就是立案&#xff0c;建立策划案。 策划案包含很多东西&#xff0c;包括游戏介绍、游戏内容、游戏模型介绍、游戏数值、…

游戏开发流程之完整指南

“现在&#xff0c;是时候改进您的游戏开发流程了。在这里&#xff0c;无论您是在独立的初创公司亦或大型游戏工作室中&#xff0c;我们都可以调度资源&#xff0c;使您的工作室的开发和设计工作晋升一个层次。” 您可以把本指引当做游戏开发流程改进的参考 我们将覆盖所有您…

游戏开发笔记(二)——开发流程和项目管理

前一篇说到分工&#xff0c;这里再说说流程和开发管理。 组织形式 从公司角度来看一个游戏工作室是一个业务比较独立的研发部门&#xff0c;研发方面的大小事务&#xff08;除了立项&#xff09;拥有高度自治权。而从一个工作室角度来看&#xff0c;通常内部又由多个项目组组成…

游戏开发 - 开发流程 - 收集

1.应用场景 主要用于了解&#xff0c;掌握游戏开发的整个流程。 2.学习/操作 1.文档阅读 复习课 | 带你梳理客户端开发的三个重点-极客时间 2.整理输出 2.1 游戏开发流程 -- 参考 按照游戏开发中的三大模块策划、程序、美术&#xff0c;画了一个图。 开发游戏的时候&#xf…