概要
词向量和词嵌入可以用来表示词。
但是如果我们想表示整个文档,就需要使用文档向量。
当我们引用文档时,我们引用的是对读者有某种意义的单词集合。
- 一个文档可以是一个句子或一组句子。
- 一个文档可以由产品评论、推文或电影对话组成,长度从几个字到数千字不等。
- 一个文档可以在机器学习(深度学习)项目中作为表示算法可以学习的文本数据样本。
我们可以用不同的技术来表示一个文档:
- 最简单的方法,计算一个文档的所有组成词向量的平均值,并用平均值向量表示该文档。
- 另外就是 Doc2Vec。
Doc2Vec
或者叫做Paragraph2vec
, Sentence Embeddings,是一种非监督式算法,可以获得句子(Sentences)/段落(Paragrahs)/文档(Documents)的向量表达,是word2vec的拓展。
Doc2Vec向量可以通过计算向量间的距离来寻找句子(Sentences)/段落(Paragrahs)/文档(Documents)之间的相似性,可以用于文本聚类;对于有标签的数据,还可以用监督学习的方法进行文本分类,例如:经典的情感分析问题分类注文档属于正面(positive)/中立(neutral)/负面(negative)。
Dov2Vec基本原理
训练句向量的方法和词向量的方法非常类似。
Word2Vec的核心思想是根据每个单词Wi的上下文预测Wi,可以理解为单词的上下文对生成单词Wi是有影响的,那么同理,可以用同样的方法训练Doc2Vec。对于一个句子S。
i want to drink water
如果要去预测句子中的单词want
。那么不仅可以根据其他单词生成特征,也可以根据其他单词和句子S来生成特征进行预测。
Doc2Vec的应用
- 文档相似性:可以使用文档向量来比较文本的相似性
- 文档推荐:根据用户已阅读过得文档推荐类似的文档
- 文档预测:根据文档向量监督学习建立预测模型,预测文档主题。
实践
使用gensim
库将新闻标题转化为Doc2Vec向量
gensim官方文档说明 - Doc2Vec向量
导入依赖库
import pandas as pd
from gensim import utils
from gensim.models.doc2vec import TaggedDocument
from gensim.models import Doc2Vec
from gensim.parsing.preprocessing import preprocess_string,remove_stopwords
import random
import warnings
warnings.filterwarnings("ignore")
载入文档
## 载入文档
sample_news_dir = "./data/sample_news_data.csv"
df = pd.read_csv(sample_news_dir)
定义预处理类
定义文档处理类,用于删除文档停用词
preprocess_string
函数将给定的过滤器应用于输入数据remove_stopwords
函数用于从给定文档中删除停用词
由于Doc2Vec要求每个样本都是TaggedDocument
实例,因此为每个文档创建一个实例列表
# 定义预处理类
class DocumentDataset(object):
def __init__(self,data:pd.DataFrame,column):
document = data[column].apply(self.preprocess)
self.documents = [TaggedDocument(text,[index]) for index,text in document.iteritems()]
def preprocess(self,document):
return preprocess_string(remove_stopwords(document))
def __iter__(self):
for document in self.documents:
yield document
def tagged_documents(self,shuffle=None):
if shuffle:
random.shuffle(self.documents)
return self.documents
调用类
documents_datasets = DocumentDataset(df,"news")
创建Doc2Vec模型
与Word2Vec 类似,Doc2Vec 类包含: min count、window、vector size、sample、negative 和workers 等参数。其中
min_count
:忽略所有频率小于指定频率的单词windows
: 设置给定句子中当前单词和预测单词之间的最大距离vector_ size
: 设置每个向量的尺寸sample
:定义了允许我们配置定期降采样的高频词的阈值,有效范围是(O, le -5)negative
: 如果> 0,将使用负采样,指定应该绘制多少噪声词(通常在5-20之间)。如果设置为0,则不使用负采样workers
:并发线程数来训练模型(多核机器能更快的训练)。
为了从句子序列构建词汇表,Doc2Vec 提供了build_vocab
方法,这里可以看到,对象必须是TaggedDocument
的实例
docVecModel = Doc2Vec(min_count=1,
window=5,
vector_size=100,
sample=1e-4,
negative=5,
workers=2)
docVecModel.build_vocab(documents_dataset.tagged_documents())
训练和保存
docVecModel.trian(documents_dataset.tagged_documents(shuffle=True),
total_examples=docVecModel.corpus_count,
epochs=30)
docVecModel.save("./docVecModel.d2v")
查看Doc2Vec
docVecModel[123]