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
是输出,单词 on
、the
和 of
对预测没有贡献,因为它们是频繁出现的单词,而输出预测结果并不能确认究竟为 “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深度学习实战——使用fastText模型构建单词向量