原文:https://blog.csdn.net/John_xyz/article/details/79424284
1.“句向量”简介
word2vec提供了高质量的词向量,并在一些任务中表现良好。
关于word2vec的原理可以参考这几篇论文:
关于如何使用第三方库gensim训练word2vec可以参考这篇博客:
尽管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 之间的相似性,可以用于文本聚类,对于有标签的数据,还可以用监督学习的方法进行文本分类,例如经典的情感分析问题。
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 += 1
if 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