基于gensim的Doc2Vec简析,以及用python 实现简要代码
2017-11-24 17:25
926 查看
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。
相关文章推荐
- 基于Tkinter用50行Python代码实现简易计算器
- 排序算法总结以及python代码实现
- 基于用户最近邻模型的协同过滤算法的Python代码实现
- Python实现冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法(基于《算法导论》伪代码)
- python基于mysql实现的简单队列以及跨进程锁实例详解
- 能分析压缩的日志,且基于文件输入的PYTHON代码实现
- 基于python实现jenkins自动发布代码平台
- [python] 基于k-means和tfidf的文本聚类代码简单实现
- python中的 \r以及基于此实现简单的倒计时小程序
- 快速实现基于Python的微信聊天机器人示例代码
- 基于DragonBoard 410c的家庭智能环保卫士——(10)数据库python代码实现
- 基于python的汉字转GBK码实现代码
- 基于python3的k-means代码实现
- 基于回归曲线拟合模型的ALS(最小二乘法)推导过程以及Python实现
- 基于cxf实现的webservice,全程开发指南和笔记,以及代码
- 基于python写的专门用于字符串匹配的smartscript实现代码
- [python] 基于k-means和tfidf的文本聚类代码简单实现
- Jquery Ajax客户端跨域请求 以及服务端Python代码实现
- python之文件的读写和文件目录以及文件夹的操作实现代码
- python基于mysql实现的简单队列以及跨进程锁