关于doc2vec

article/2025/8/23 19:51:11

原文地址:https://blog.csdn.net/john_xyz/article/details/79208564

 

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的同学都知道,下图是学习词向量表达最经典的一幅图。在下图中,任务就是给定上下文,预测上下文的其他单词。

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

当然,预测的任务是一个多分类问题,分类器最后一层使用softmax,计算公式如下: 

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

这里U和b都是参数,h是将级联或者求平均。 

因为每个单词都是一类,所以类别众多,在计算softmax归一化的时候,效率很低。因此使用hierarical softmax加快计算速度,其实就是huffman树,这个不再赘述,有兴趣的同学可以看word2vec的paper。

doc2vec基本原理

1. A distributed memory model

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

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

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

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

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

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

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

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

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

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

3. 基于gensim的doc2vec实践

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

 
  1. # -*- coding: utf-8 -*-

  2. import sys

  3. import logging

  4. import os

  5. import gensim

  6. # 引入doc2vec

  7. from gensim.models import Doc2Vec

  8. curPath = os.path.abspath(os.path.dirname(__file__))

  9. rootPath = os.path.split(curPath)[0]

  10. sys.path.append(rootPath)

  11. from utilties import ko_title2words

  12.  
  13. # 引入日志配置

  14. logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

  15.  
  16. # 加载数据

  17. documents = []

  18. # 使用count当做每个句子的“标签”,标签和每个句子是一一对应的

  19. count = 0

  20. with open('../data/titles/ko.video.corpus','r') as f:

  21. for line in f:

  22. title = unicode(line, 'utf-8')

  23. # 切词,返回的结果是列表类型

  24. words = ko_title2words(title)

  25. # 这里documents里的每个元素是二元组,具体可以查看函数文档

  26. documents.append(gensim.models.doc2vec.TaggedDocument(words, [str(count)]))

  27. count += 1

  28. if count % 10000 == 0:

  29. logging.info('{} has loaded...'.format(count))

  30.  
  31. # 模型训练

  32. model = Doc2Vec(documents, dm=1, size=100, window=8, min_count=5, workers=4)

  33. # 保存模型

  34. model.save('models/ko_d2v.model')

 

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

 
  1. def test_doc2vec():

  2. # 加载模型

  3. model = doc2vec.Doc2Vec.load('models/ko_d2v.model')

  4. # 与标签‘0’最相似的

  5. print(model.docvecs.most_similar('0'))

  6. # 进行相关性比较

  7. print(model.docvecs.similarity('0','1'))

  8. # 输出标签为‘10’句子的向量

  9. print(model.docvecs['10'])

  10. # 也可以推断一个句向量(未出现在语料中)

  11. words = u"여기 나오는 팀 다 가슴"

  12. print(model.infer_vector(words.split()))

  13. # 也可以输出词向量

  14. print(model[u'가슴'])

 

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


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

相关文章

doc2vec java_doc2vec

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

Doc2Vec的简介及应用(gensim)

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

Doc2Vec模型介绍及使用

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

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

本文旨在向您介绍 Doc2Vec 模型,以及它在计算文档之间的相似性时如何提供帮助。 目录 前言 一、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(IMDB数据集)2、gensim实现Doc2Vec(中文数据集) 三、总结四、程序编写时遇到的错误:gensim包中相关函数说明: 参考资料&…

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

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

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

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

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

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

游戏开发所需要的知识

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

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

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

游戏开发流程之完整指南

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

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

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

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

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

游戏开发完整流程

1. 立项 一个项目立项的原因可能性非常多,有可能是公司拿到一个好的IP,也有可能是几个负责人有个很棒的idea,亦或是老板的梦想是做一个XX类型的游戏,这边不做过多的讨论。 立项过程中应该包含市场调查和产品定位&#xff0c…

如何开发一款游戏?【游戏开发所需技能和开发流程】

开发一款游戏需要的技能包括:编程、设计、音效和项目管理。每个角色都需要掌握其特定领域的知识和技能,并与其他团队成员合作。在本文中,我们将深入探讨如何开发一款游戏。 1. 游戏开发流程 游戏开发流程可以分为以下几个阶段: …

如何开发一款游戏:游戏开发流程及所需工具

本文来自作者 goto先生 在 GitChat 上分享 「如何开发一款游戏:游戏开发流程及所需工具」 编辑 | 哈比 游戏作为娱乐生活的一个方面,参与其中的人越来越多,而大部分参与其中的人都是以玩家的身份。 他们热爱一款游戏,或是被游戏的…

文本识别CRNN模型介绍以及pytorch代码实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、CRNN模型介绍1.模型结构2.CTCLossbeam search 二、使用pytorch实现crnn数据集 前言 文本识别是图像领域的一个常见任务,场景文字识别OCR任务中…

crnn 学习笔记

常用文本识别算法有两种: CNNRNNCTC(CRNNCTC)CNNSeq2SeqAttention 其中CTC与Attention相当于是一种对齐方式,具体算法原理比较复杂,就不做详细的探讨。其中CTC可参考这篇博文,关于Attention机制的介绍&am…

智能驾驶 车牌检测和识别(三)《CRNN和LPRNet实现车牌识别(含车牌识别数据集和训练代码)》

智能驾驶 车牌检测和识别(三)《CRNN和LPRNet实现车牌识别(含车牌识别数据集和训练代码)》 目录 智能驾驶 车牌检测和识别(三)《CRNN和LPRNet实现车牌识别(含车牌识别数据集和训练代码&#xf…

pytorch(11)-- crnn 车牌端到端识别

车牌图片端到端识别 一、前言二、数据集处理三、crnn模型文件四、训练验证代码五、测试代码六、代码搬自 一、前言 本文主要记录了使用crnn 对车牌图片做端到端识别,即不用对车牌字符做逐个字符分割识别,车牌第一个字符为汉字,共有31个&#…