Doc2Vec简单实现

1,625 阅读3分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

概要

词向量和词嵌入可以用来表示词。

但是如果我们想表示整个文档,就需要使用文档向量。

当我们引用文档时,我们引用的是对读者有某种意义的单词集合。

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

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

  • 最简单的方法,计算一个文档的所有组成词向量的平均值,并用平均值向量表示该文档。
  • 另外就是 Doc2Vec。

Doc2Vec或者叫做Paragraph2vec是一种非监督式算法,可以获得句子(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())

训练和保存 Doc2Vec

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

查看Doc2Vec

docVecModel[123]