概要

词向量和词嵌入可以用来表示词。
但是如果我们想表示整个文档,就需要使用文档向量。
当我们引用文档时,我们引用的是对读者有某种意义的单词集合。

  • 一个文档可以是一个句子或一组句子。
  • 一个文档可以由产品评论、推文或电影对话组成,长度从几个字到数千字不等。
  • 一个文档可以在机器学习(深度学习)项目中作为表示算法可以学习的文本数据样本。

我们可以用不同的技术来表示一个文档:

  • 最简单的方法,计算一个文档的所有组成词向量的平均值,并用平均值向量表示该文档。
  • 另外就是 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向量

导入依赖库

  1. import pandas as pd
  2. from gensim import utils
  3. from gensim.models.doc2vec import TaggedDocument
  4. from gensim.models import Doc2Vec
  5. from gensim.parsing.preprocessing import preprocess_string,remove_stopwords
  6. import random
  7. import warnings
  8. warnings.filterwarnings("ignore")

载入文档

  1. ## 载入文档
  2. sample_news_dir = "./data/sample_news_data.csv"
  3. df = pd.read_csv(sample_news_dir)

image.png

定义预处理类

定义文档处理类,用于删除文档停用词

  • preprocess_string函数将给定的过滤器应用于输入数据
  • remove_stopwords函数用于从给定文档中删除停用词

由于Doc2Vec要求每个样本都是TaggedDocument实例,因此为每个文档创建一个实例列表

  1. # 定义预处理类
  2. class DocumentDataset(object):
  3. def __init__(self,data:pd.DataFrame,column):
  4. document = data[column].apply(self.preprocess)
  5. self.documents = [TaggedDocument(text,[index]) for index,text in document.iteritems()]
  6. def preprocess(self,document):
  7. return preprocess_string(remove_stopwords(document))
  8. def __iter__(self):
  9. for document in self.documents:
  10. yield document
  11. def tagged_documents(self,shuffle=None):
  12. if shuffle:
  13. random.shuffle(self.documents)
  14. return self.documents

调用类

  1. 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的实例

  1. docVecModel = Doc2Vec(min_count=1,
  2. window=5,
  3. vector_size=100,
  4. sample=1e-4,
  5. negative=5,
  6. workers=2)
  7. docVecModel.build_vocab(documents_dataset.tagged_documents())

训练和保存

  1. docVecModel.trian(documents_dataset.tagged_documents(shuffle=True),
  2. total_examples=docVecModel.corpus_count,
  3. epochs=30)
  4. docVecModel.save("./docVecModel.d2v")

查看Doc2Vec

  1. docVecModel[123]

image.png