Keras深度学习实战(26)——文档向量详解

Posted 盼小辉丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras深度学习实战(26)——文档向量详解相关的知识,希望对你有一定的参考价值。

Keras深度学习实战(26)——文档向量详解

0. 前言

《从零开始构建单词向量》一节中,我们学习了单词向量的基本概念,并且学习了如何生成单词向量,以使语义相似的单词具有相似的单词向量。但是,我们知道许多单词在不同的上下文语境中会有不同的含义,而仅仅使用单词向量并不能体现这种差异,为了解决这一问题,提出了文档向量的概念,用于捕获单词上下文语境信息。

1. 文档向量基本概念

要了解文档向量,我们考虑以下场景。例如,bank 一词在金融(表示银行)和水利(表示河岸)相关主题中均有使用。这时,我们如何确定给定句子或文档中的 bank 究竟是与水利相关还是与金融相关?这就是文档向量所需要解决的问题,文档向量的工作方式与单词向量生成类似,但是增加了段落 ID 的独热编码,如下所示:

在上述情况下,段落 ID 包含了仅使用单词无法捕获的信息。例如,在语句 on the bank of river 中,on bank of 是输入,river 是输出,单词 ontheof 对预测没有贡献,因为它们是频繁出现的单词,而输出预测结果并不能确认究竟为 “river” 或 “China”。 而特定文档的文档 ID 有助于识别该文档是与水利相关还是与金融相关。该模型称为段落向量的分布式存储模型(Distributed Memory Model of Paragraph Vectors, PV-DM)。
例如,如果文档数为 100,则文档 ID 的独热编码将为 100 维。同样,如果满足单词最低频率的不重复单词的数量为 1000,则单词的独热编码的维度为 1000。当隐藏层大小(即单词向量大小)为 300 时,参数总数为 ( 100 + 1000 ) × 300 = 330000 (100+1000) \\times 300 = 330000 (100+1000)×300=330000。将输入单词的独热编码均置为 0 时,隐藏层的输出值即为文档向量,也就说是,其消除了单词的影响,而仅考虑文档 ID 的影响。
类似于在 skip-gram 模型和 CBOW 模型中构建输入和输出的方式,对于文档向量,也可以按以下方式构建输出和输入:

这种模型表示称为带有分布式词袋的段落向量 (paragraph vector with a distributed bag of words, PVDBOW)。

2. 神经网络模型与数据集分析

2.1 模型分析

在实现神经网络之前,我们首先探讨用于构建文档向量的策略流程:

  • 预处理输入句子:删除标点符号、将所有单词的转换为小写形式,并删除停用词,例如,出现频率很高且不能为句子增加上下文的单词
  • 用句子 ID 标记每个句子
  • 为每个句子分配一个 ID
  • 使用 Doc2Vec 方法提取文档 ID 和单词的向量
  • 在多个 epoch 中训练 Doc2Vec 方法,以便充分调整模型权重

2.2 数据集介绍

接下来,我们实现上述模型生成文档向量,所用的数据集与在《从零开始构建单词向量》一节中使用的数据集相同,即航空公司 Twitter 数据集。

3. 利用 Keras 构建神经网络模型生成文档向量

我们已经直观地了解了如何生成文档向量,并介绍了构建文档向量的策略。接下来,我们利用上一小节介绍的策略,生成航空公司 Twitter 数据集的文档向量。

(1) 导入相关库,并加载数据集:

from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from nltk.tokenize import word_tokenize
import pandas as pd

data = pd.read_csv('archive/Tweets.csv')
print(data.head())

(2) 预处理 Twitter 数据集文本数据:

import re
import nltk
from nltk.corpus import stopwords

stop = set(stopwords.words('english'))

def preprocess(text):
    text=text.lower()
    text=re.sub('[^0-9a-zA-Z]+',' ',text)
    words = text.split()
    words2 = [i for i in words if i not in stop]
    words3=' '.join(words2)
    return(words3)
data['text'] = data['text'].apply(preprocess)

(3) 创建一个带标签的文档字典,其中包含文档 ID 和相应文本:

tagged_data = [TaggedDocument(words=word_tokenize(_d.lower()), tags=[str(i)]) for i, _d in enumerate(data['text'])]
print(tagged_data[:3])

带标签的文档数据输出结果如下所示:

[TaggedDocument(words=['virginamerica', 'dhepburn', 'said'], tags=['0']),
TaggedDocument(words=['virginamerica', 'plus', 'added', 'commercials', 'experience', 'tacky'], tags=['1']),
TaggedDocument(words=['virginamerica', 'today', 'must', 'mean', 'need', 'take', 'another', 'trip'], tags=['2'])]

(4) 接下来,初始化 Doc2Vec 模型对象:

max_epochs = 200
vec_size = 50
alpha = 0.025
model = Doc2Vec(vector_size=vec_size,
                alpha=alpha,
                min_alpha=0.00025,
                min_count=30,
                dm=1)

Doc2Vec 对象参数中,size 表示文档矢量大小,alpha 表示学习率,min_count 表示要考虑的单词的最小频率,dm = 1 表示使用 PV-DM

(5) 建立词汇表:

model.build_vocab(tagged_data)

(6) 在标记数据集上训练模型:

model.train(tagged_data, epochs=100, total_examples=model.corpus_count)

(7) 训练过程将为单词以及文档 ID 生成向量。获取单词向量与文档向量的方式,如下所示:

# 获取单词向量
print(model.wv.get_vector('wife'))
# 获取文档向量
print(model.dv[0])

(8) 提取与给定文档 ID 最相似的文档:

similar_doc = model.dv.most_similar('457')
print(similar_doc)

输出得到的与给定文档 ID 最相似的文档 ID 如下所示:

[-0.01046163 -0.01195826 -0.01976151  0.01710569  0.00713223  0.00052606
 -0.01976126 -0.0103333  -0.01943593  0.00402156  0.00566062  0.00928711
 -0.00859455 -0.00629141 -0.00615757 -0.01744383  0.00434496  0.01845124
 -0.01900373 -0.00691617 -0.00753982  0.00521476 -0.01138311  0.00524136
  0.01160504 -0.01621372 -0.01665958 -0.01990934  0.00986609 -0.01824461
  0.01168393  0.01360053 -0.0130128  -0.00903976 -0.00250972  0.00329264
 -0.00296268 -0.01708508 -0.00720523  0.00346325 -0.00411384 -0.01446009
  0.0083692  -0.01714868  0.00542307 -0.00922744  0.00129086 -0.00411469
  0.01082645 -0.01600514]

小结

本节中,我们首先介绍了文档向量概念提出的背景,然后介绍了文档向量的基本概念以及如何生成文档向量,并了解了构建文档向量的策略,最后使用 Keras 从零开始实现了文档向量生成模型,并使用航空公司的 Twitter 数据集训练得到了数据集的文档向量。

系列链接

Keras深度学习实战(1)——神经网络基础与模型训练过程详解
Keras深度学习实战(2)——使用Keras构建神经网络
Keras深度学习实战(3)——神经网络性能优化技术
Keras深度学习实战(4)——深度学习中常用激活函数和损失函数详解
Keras深度学习实战(5)——批归一化详解
Keras深度学习实战(6)——深度学习过拟合问题及解决方法
Keras深度学习实战(7)——卷积神经网络详解与实现
Keras深度学习实战(8)——使用数据增强提高神经网络性能
Keras深度学习实战(9)——卷积神经网络的局限性
Keras深度学习实战(10)——迁移学习详解
Keras深度学习实战(11)——可视化神经网络中间层输出
Keras深度学习实战(12)——面部特征点检测
Keras深度学习实战(13)——目标检测基础详解
Keras深度学习实战(14)——从零开始实现R-CNN目标检测
Keras深度学习实战(15)——从零开始实现YOLO目标检测
Keras深度学习实战(16)——自编码器详解
Keras深度学习实战(17)——使用U-Net架构进行图像分割
Keras深度学习实战(18)——语义分割详解
Keras深度学习实战(19)——使用对抗攻击生成可欺骗神经网络的图像
Keras深度学习实战(20)——DeepDream模型详解
Keras深度学习实战(21)——神经风格迁移详解
Keras深度学习实战(22)——生成对抗网络详解与实现
Keras深度学习实战(23)——DCGAN详解与实现
Keras深度学习实战(24)——从零开始构建单词向量
Keras深度学习实战(25)——使用skip-gram和CBOW模型构建单词向量

以上是关于Keras深度学习实战(26)——文档向量详解的主要内容,如果未能解决你的问题,请参考以下文章

Keras深度学习实战(27)——循环神经详解与实现

Keras深度学习实战(27)——循环神经详解与实现

Keras深度学习实战——使用fastText模型构建单词向量

Keras深度学习实战——使用GloVe模型构建单词向量

Keras深度学习实战——使用fastText模型构建单词向量

Keras深度学习实战——使用GloVe模型构建单词向量