用 Doc2Vec 得到文档/段落/句子的向量表达
本文结构:
- Doc2Vec 有什么用
- 两种实现方法
- 用 Gensim 训练 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)
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”]
- 得到向量后,可以计算相似性,输入给机器学习算法做情感分类等任务了。
资料: https://arxiv.org/abs/1405.4053 https://rare-technologies.com/doc2vec-tutorial/ https://medium.com/@klintcho/doc2vec-tutorial-using-gensim-ab3ac03d3a1
相关文章: word2vec 模型思想和代码实现 怎样做情感分析
- 这或许是对小白最友好的python入门了吧——13,字典初识
- PHP 安全与性能
- 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该...
- Linux 系统与数据库安全
- 这或许是对小白最友好的python入门了吧——12,列表深入体验
- 初识SqlLite ---.net连接数据库
- 【实践操作】:六步教你如何用开源框架Tensorflow对象检测API构建一个玩具检测器
- 这或许是对小白最友好的python入门了吧——11,if语句初体验
- 你的网站做好神马搜索优化了吗?神马搜索站长工具提交
- 应用程序的通信成本
- 这或许是对小白最友好的python入门了吧——18,定义函数
- 【深度学习】图片风格转换应用程序:使用CoreML创建Prisma
- 压力测试中存在的问题
- 这或许是对小白最友好的python入门了吧——18,用while循环处理列表
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- String及StringTable(二):java中的StringTable
- 设在起始地址为STRING的存储空间存放了一个字符串(该串已存放在内存中,无需输入,且串长不超过99),统计字符串中字符“A”的个数,并将结果显示在屏幕上。
- Docker容器ElasticSearch-Head创建索引无响应406
- springboot监控&springboot配置https
- 面试中最长常问到的 HashMap,你都知道多少?
- spring security 使用自定义AuthenticationFailureHandler无法跳转failureUrl
- Android studio 下载安装教程和第一个程序运行最新,多图详解
- ubuntu16.04下qt5.14报错:/home/zhangfakai/Qt5.14.1/5.14.1/gcc_64/include/QtGui/qopengl.h:141: error: GL/
- 每天手撕一道算法-64. 最小路径和
- 每日手撕一道算法题-322.零钱兑换
- 每天手撕一道算法题-130. 被围绕的区域
- TKE上部署metrics-server
- Docker-Compose搭建mysql、redis、zookeeper、rabbitmq、consul、elasticsearch环境
- MDK更改配色方案
- Apache通过多端口配置多站点