目录

一.Doc2vec原理

二.代码实现

三.总结

一.Doc2vec原理

前文总结了Word2vec训练词向量的细节,讲解了一个词是如何通过word2vec模型训练出唯一的向量来表示的。那接着可能就会想到,有没有什么办法能够将一个句子甚至一篇短文也用一个向量来表示呢?答案是肯定有的,构建一个句子向量有很多种方法,今天我们接着word2vec来介绍下Doc2vc,看下Doc2vec是怎么训练一个句子向量的。

许多机器学习算法需要的输入是一个固定长度的向量,当涉及到短文时,最常用的固定长度的向量方法是词袋模型(bag-of-words)。尽管它很流行,但是词袋模型存在两个主要的缺点:一个是词袋模型忽略词序,如果两个不同的句子由相同的词但是顺序不同组成,词袋模型会将这两句话定义为同一个表达;另一个是词袋模型忽略了句法,这样训练出来的模型会造成类似‘powerful‘,‘strong’和‘Paris’的距离是相同的,而其实‘powerful’应该相对于’Paris‘距离’strong‘更近才对。

Doc2vec又叫Paragraph Vector是Tomas Mikolov基于word2vec模型提出的,其具有一些优点,比如不用固定句子长度,接受不同长度的句子做训练样本,Doc2vec是一个无监督学习算法,该算法用于预测一个向量来表示不同的文档,该模型的结构潜在的克服了词袋模型的缺点。

Doc2vec模型是受到了word2vec模型的启发,word2vec里预测词向量时,预测出来的词是含有词义的,比如上文提到的词向量’powerful’会相对于’Paris’离’strong‘距离更近,在Doc2vec中也构建了相同的结构。所以Doc2vec克服了词袋模型中没有语义的去缺点。假设现在存在训练样本,每个句子是训练样本。和word2vec一样,Doc2vec也有两种训练方式,一种是PV-DM(Distributed Memory Model of paragraph vectors)类似于word2vec中的CBOW模型,如图一:

另一种是PV-DBOW(Distributed Bag of Words of paragraph vector类似于Word2vec中的skip-gram模型,如图二:

在Doc2vec中,每一句话用唯一的向量来表示,用矩阵D的某一列来代表。每一个词也用唯一的向量来表示,用矩阵W的某一列来表示。以PV-DM模型为例,如图三:

每次从一句话中滑动采样固定长度的词,取其中一个词作预测词,其他的作输入词。输入词对应的词向量word vector和本句话对应的句子向量Paragraph vector作为输入层的输入,将本句话的向量和本次采样的词向量相加求平均或者累加构成一个新的向量X,进而使用这个向量X预测此次窗口内的预测词。

Doc2vec相对于word2vec不同之处在于,在输入层,增添了一个新的句子向量Paragraph vector,Paragraph vector可以被看作是另一个词向量,它扮演了一个记忆,词袋模型中,因为每次训练只会截取句子中一小部分词训练,而忽略了除了本次训练词以外该句子中的其他词,这样仅仅训练出来每个词的向量表达,句子只是每个词的向量累加在一起表达的。正如上文所说的词袋模型的缺点,忽略了文本的词序问题。而Doc2vec中的Paragraph vector则弥补了这方面的不足,它每次训练也是滑动截取句子中一小部分词来训练,Paragraph Vector在同一个句子的若干次训练中是共享的,所以同一句话会有多次训练,每次训练中输入都包含Paragraph vector。它可以被看作是句子的主旨,有了它,该句子的主旨每次都会被放入作为输入的一部分来训练。这样每次训练过程中,不光是训练了词,得到了词向量。同时随着一句话每次滑动取若干词训练的过程中,作为每次训练的输入层一部分的共享Paragraph vector,该向量表达的主旨会越来越准确。Doc2vec中PV-DM模型具体的训练过程和word2vec中的CBOW模型训练方式相同,在之前我写的基于Word2vec训练词向量(一)里有详细介绍,这里就不在重复。

训练完了以后,就会得到训练样本中所有的词向量和每句话对应的句子向量,那么Doc2vec是怎么预测新的句子Paragraph vector呢?其实在预测新的句子的时候,还是会将该Paragraph vector随机初始化,放入模型中再重新根据随机梯度下降不断迭代求得最终稳定下来的句子向量。不过在预测过程中,模型里的词向量还有投影层到输出层的softmax weights参数是不会变的,这样在不断迭代中只会更新Paragraph vector,其他参数均已固定,只需很少的时间就能计算出带预测的Paragraph vector。

二.代码实现

在python中使用gensim包调用Doc2vec方便快捷,在这简单演示下,gensim下Doc2vec详细的参数不在此详细阐述。本次的数据是之前比赛中公开的旅游数据集,里边每一条都是游客对于景点的评价。具体的Doc2vec训练Paragraph vector步骤如下:

1.导包:导入必要的包,其中的jieba是为了给文本进行分词。

2.导入数据集,提取Discuss列(该列是用户评价的内容)。

3.将提取好的Discuss列中的内容进行分词,并去除停用词。

4.改变成Doc2vec所需要的输入样本格式,由于gensim里Doc2vec模型需要的输入为固定格式,输入样本为:[句子,句子序号],这里需要用gensim中Doc2vec里的TaggedDocument来包装输入的句子。

5.加载Doc2vec模型,并开始训练。

6.模型训练完毕以后,就可以预测新的句子的向量Paragraph vector了,这里用gensim里infer_vector()预测新的句子,这里根据经验,alpha(学习步长)设置小一些,迭代次数设置大一些。找到训练样本中与这个句子最相近的10个句子。可以看到训练出来的结果与测试的新句子是有关联的。

三.总结

Doc2vec是基于Word2vec基础上构建的,相比于Word2vec,Doc2vec不仅能训练处词向量还能训练处句子向量并预测新的句子向量。Doc2vec模型结构相对于Word2vec,不同点在于在输入层上多增加了一个Paragraph vector句子向量,该向量在同一句下的不同的训练中是权值共享的,这样训练出来的Paragraph vector就会逐渐在每句子中的几次训练中不断稳定下来,形成该句子的主旨。这样就训练出来了我们需要的句子向量。在预测新的句子向量时,是需要重新训练的,此时该模型的词向量和投影层到输出层的soft weights参数固定,只剩下Paragraph vector用梯度下降法求得,所以预测新句子时虽然也要放入模型中不断迭代求出,相比于训练时,速度会快得多。本次使用的数据集为情感分析,且大多数样本偏向于好评,样本内容比较单一,所以训练出来的结果都是偏向于哪里好玩,好不好这类的意思,对于一些特定的问题之类的句子准确性还没有验证,目前用于情感分析还是可以的。下次会尝试使用新的数据集,调试参数看是否会取得更好的结果。

https://zhuanlan.zhihu.com/p/36886191

基于Doc2vec训练句子向量相关推荐

  1. 基于预训练词向量的文本相似度计算-word2vec, paddle

    文章目录 0. 前言 1. 余弦相似度算子 2. 示例代码并验证 3. 基于词向量的文本相似度 3.1 读取word2vec文件 3.2 定义模型 3.3 运行模型 3.4 根据分数降序排列 3.5 ...

  2. 【NLP_向量表示】使用Word2Vec训练字向量

    重要参考 https://github.com/liuhuanyong/ChineseEmbedding 原文作者提供了字向量.拼音向量.词向量.词性向量与依存关系向量,共5种类型的向量训练, 在此, ...

  3. NLP-分类模型-2016-文本分类:FastText【使用CBOW的模型结构;作用:①文本分类、②训练词向量、③词向量模型迁移(直接拿FastText官方已训练好的词向量来使用)】【基于子词训练】

    <原始论文:Bag of Tricks for Efficient Text Classification> <原始论文:Enriching Word Vectors with Su ...

  4. Python Djang 搭建自动词性标注网站(基于Keras框架和维基百科中文预训练词向量Word2vec模型,分别实现由GRU、LSTM、RNN神经网络组成的词性标注模型)

    引言 本文基于Keras框架和维基百科中文预训练词向量Word2vec模型,分别实现由GRU.LSTM.RNN神经网络组成的词性标注模型,并且将模型封装,使用python Django web框架搭建 ...

  5. 从零开始构建基于textcnn的文本分类模型(上),word2vec向量训练,预训练词向量模型加载,pytorch Dataset、collete_fn、Dataloader转换数据集并行加载

    伴随着bert.transformer模型的提出,文本预训练模型应用于各项NLP任务.文本分类任务是最基础的NLP任务,本文回顾最先采用CNN用于文本分类之一的textcnn模型,意在巩固分词.词向量 ...

  6. 基于Keras预训练词向量模型的文本分类方法

    本文语料仍然是上篇所用的搜狗新闻语料,采用中文预训练词向量模型对词进行向量表示.上篇文章将文本分词之后,采用了TF-IDF的特征提取方式对文本进行向量化表示,所产生的文本表示矩阵是一个稀疏矩阵,本篇采 ...

  7. 基于doc2vec的中文文本聚类及去重

    Understand doc2vec Data introduction Train a model Test the model Cluster all the lyrics Filter out ...

  8. 词向量、句子向量、篇章向量的一些理解(转)

    2019独角兽企业重金招聘Python工程师标准>>> 词向量.句子向量.篇章向量的一些理解(转) (转自)http://blog.csdn.net/sinat_26917383/a ...

  9. 系统学习NLP(十四)--句子向量与篇章向量

    转自:https://blog.csdn.net/qq_35082030/article/details/72582103 Doc2Vec 或者叫做 paragraph2vec, sentence e ...

最新文章

  1. UML基本架构建模--获取类
  2. ActiveReports 报表应用教程 (2)---清单类报表
  3. python那么慢为什么还有人用-为什么Python比C++慢很多?
  4. 2018年第九届蓝桥杯C/C++ C组国赛 —— 第二题:最大乘积
  5. linux无法设置变量,linux – crontab在作业之前无法设置变量
  6. pytorch CNN
  7. python引入pytesseract报错:ValueError: Attempted relative import in non-package
  8. oracle select between and,oracle中的between和and的问题 | 学步园
  9. JAVA学习day10
  10. Python中文分词神器---jieba
  11. 领导说我对任务的理解是错的
  12. C#实现让鼠标点击任意绝对位置
  13. 快速查询多个圆通快递未签收单号的走件信息
  14. UOS体验(一)之VMware安装教程
  15. java如何删除一本图书_javaEE项目网上书城后台(如何删除一本书并且有提示)...
  16. [luogu] P1637 三元上升子序列 树状数组
  17. 【SQL注入】SQL注入基本流程
  18. SciTe 无法输入中文解决方法(图文版)
  19. 二、计算机网络的标准化工作
  20. 微软hackathon总结

热门文章

  1. 来了!娱乐篇!一文带你了解那些适合日常使用的开源工具和应用(娱乐篇)
  2. 计算机网络管理员岗位要求,网络管理员岗位职责
  3. P2P视频聊天技术分析
  4. 估值超400亿美元的京东物流,已成顺丰最有力的竞争对手
  5. 紫光同创国产FPGA学习之Fabric Debugger
  6. 网络技术原理之数据通信原理
  7. 聊聊数据的分类和分级
  8. 结束进程 --inux命令
  9. 微信中页面二次分享小图标丢失问题
  10. 如何调整uniapp轮播图swiper的样式(dot的样式和位置)