keras深度学习实战(26)——文档向量详解(代码片段)

盼小辉丶 盼小辉丶     2023-03-17     371

关键词:

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深度学习实战——使用fasttext模型构建单词向量(代码片段)

Keras深度学习实战——使用fastText模型构建单词向量0.前言1.fastText算法模型2.模型与数据集分析2.1fastText模型分析2.2数据集分析3.使用Keras实现fastText生成单词向量相关链接0.前言fastText是另一种用于生成单词向量的神经网络模型,其... 查看详情

keras深度学习实战——使用glove模型构建单词向量(代码片段)

Keras深度学习实战——使用GloVe模型构建单词向量0.前言1.GloVe算法模型1.1模型目标1.2GloVe算法计算细节3.实现GloVe模型构建单词向量3.1数据集3.2模型实现相关链接0.前言在《使用fastText模型构建单词向量》一节中,我们学习了如何构... 查看详情

keras深度学习实战——使用glove模型构建单词向量(代码片段)

Keras深度学习实战——使用GloVe模型构建单词向量0.前言1.GloVe算法模型1.1模型目标1.2GloVe算法计算细节3.实现GloVe模型构建单词向量3.1数据集3.2模型实现相关链接0.前言在《使用fastText模型构建单词向量》一节中,我们学习了如... 查看详情

keras深度学习实战——使用fasttext模型构建单词向量(代码片段)

Keras深度学习实战——使用fastText模型构建单词向量0.前言1.fastText算法模型2.模型与数据集分析2.1fastText模型分析2.2数据集分析3.使用Keras实现fastText生成单词向量相关链接0.前言fastText是另一种用于生成单词向量的神经网络模型࿰... 查看详情

keras深度学习实战(24)——从零开始构建单词向量(代码片段)

Keras深度学习实战(24)——从零开始构建单词向量0.前言1.单词向量1.1Word2Vec原理1.2构建单词向量1.3神经网络架构2.使用Keras从零开始构建单词向量3.测量单词向量之间的相似度小结系列链接0.前言在解决文本相关问题时,传统方法... 查看详情

keras深度学习实战(16)——自编码器详解(代码片段)

Keras深度学习实战(16)——自编码器详解0.前言1.编码的必要性1.1对文本进行编码1.2对图像进行编码2.使用自编码器编码图像2.1自编码器模型分析2.2原始自编码器2.2多层自编码器2.3卷积自编码器3.自编码器应用3.1低维潜编... 查看详情

keras深度学习实战(28)——利用单词向量构建情感分析模型(代码片段)

Keras深度学习实战(28)——利用单词向量构建情感分析模型0.前言1.模型与数据集分析1.1模型分析1.2数据集分析2.情感分析模型2.1使用CBOW模型获取单词向量2.2构建并训练情感分析模型小结系列链接0.前言在获取单词向量的相关博... 查看详情

keras深度学习实战(24)——从零开始构建单词向量(代码片段)

Keras深度学习实战(24)——从零开始构建单词向量0.前言1.单词向量1.1Word2Vec原理1.2构建单词向量1.3神经网络架构2.使用Keras从零开始构建单词向量3.测量单词向量之间的相似度小结系列链接0.前言在解决文本相关问题时ÿ... 查看详情

keras深度学习实战(23)——dcgan详解与实现(代码片段)

Keras深度学习实战(23)——DCGAN详解与实现0.前言1.使用DCGAN生成手写数字图像2.使用DCGAN生成面部图像2.1模型分析2.2从零开始实现DCGAN生成面部图像小结系列链接0.前言在生成对抗网络(GenerativeAdversarialNetworks,GAN)一节中,我们使用... 查看详情

keras深度学习实战(20)——神经风格迁移详解(代码片段)

Keras深度学习实战(20)——神经风格迁移详解0.前言1.神经风格迁移原理2.模型分析3.使用Keras实现神经风格迁移小结系列链接0.前言在DeepDream图像生成算法的学习中,我们通过修改像素值试图使神经网络中卷积核的激... 查看详情

keras深度学习实战(23)——dcgan详解与实现(代码片段)

Keras深度学习实战(23)——DCGAN详解与实现0.前言1.使用DCGAN生成手写数字图像2.使用DCGAN生成面部图像2.1模型分析2.2从零开始实现DCGAN生成面部图像小结系列链接0.前言在生成对抗网络(GenerativeAdversarialNetworks,GAN)一节中,... 查看详情

keras深度学习实战(20)——deepdream模型详解(代码片段)

Keras深度学习实战(20)——DeepDream模型详解0.前言1.DeepDream的技术原理2.DeepDream模型分析3.DeepDream算法实现3.1数据加载与预处理3.2DeepDream生成模型小结系列链接0.前言在《对抗样本生成》一节中,我们通过略微修改输入... 查看详情

keras深度学习实战(13)——目标检测基础详解(代码片段)

Keras深度学习实战(13)——目标检测基础详解0.前言1.目标检测概念2.创建自定义目标检测数据集2.1windows2.2Ubuntu2.3MacOS3.使用选择性搜索在图像内生成候选区域3.1候选区域3.2选择性搜索3.3使用选择性搜索生成候选区域4.交并... 查看详情

keras深度学习实战(18)——语义分割详解(代码片段)

Keras深度学习实战(18)——语义分割详解0.前言1.语义分割基本概念2.模型与数据集分析2.1模型训练流程2.2模型输出3.实现语义分割模型3.1加载数据集3.2模型构建与训练小结系列链接0.前言在《使用U-Net架构进行图像分割》... 查看详情

keras深度学习实战(25)——使用skip-gram和cbow模型构建单词向量

Keras深度学习实战(25)——使用skip-gram和CBOW模型构建单词向量0.前言1.skip-gram和CBOW模型1.1CBOW模型基本原理1.2skip-gram模型基本原理2.构建单词向量2.1数据集分析2.2使用算法CBOW模型构建单词向量2.3使用skip-gram模型构建单词向量3.使... 查看详情

keras深度学习实战(25)——使用skip-gram和cbow模型构建单词向量

Keras深度学习实战(25)——使用skip-gram和CBOW模型构建单词向量0.前言1.skip-gram和CBOW模型1.1CBOW模型基本原理1.2skip-gram模型基本原理2.构建单词向量2.1数据集分析2.2使用算法CBOW模型构建单词向量2.3使用skip-gram模型构建单词向量3.使... 查看详情

keras深度学习实战(27)——循环神经详解与实现(代码片段)

Keras深度学习实战(27)——循环神经详解与实现0.前言1.循环神经网络(RecurrentNeuralNetwork,RNN)架构简介1.1传统文本处理方法的局限性1.2RNN架构简介1.3RNN内存存储机制2.从零开始构建RNN2.1模型分析2.2使用Python从零开始构建RNN模... 查看详情

keras深度学习实战(27)——循环神经详解与实现(代码片段)

Keras深度学习实战(27)——循环神经详解与实现0.前言1.循环神经网络(RecurrentNeuralNetwork,RNN)架构简介1.1传统文本处理方法的局限性1.2RNN架构简介1.3RNN内存存储机制2.从零开始构建RNN2.1模型分析2.2使用Python从零开始构建RNN模... 查看详情