0


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'))defpreprocess(text):
    text=text.lower()
    text=re.sub('[^0-9a-zA-Z]+',' ',text)
    words = text.split()
    words2 =[i for i in words if i notin 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 inenumerate(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.017105690.007132230.00052606
 -0.01976126 -0.0103333  -0.01943593  0.004021560.005660620.00928711
 -0.00859455 -0.00629141 -0.00615757 -0.01744383  0.004344960.01845124
 -0.01900373 -0.00691617 -0.00753982  0.00521476 -0.01138311  0.005241360.01160504 -0.01621372 -0.01665958 -0.01990934  0.00986609 -0.01824461
  0.011683930.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模型构建单词向量


本文转载自: https://blog.csdn.net/LOVEmy134611/article/details/126669662
版权归原作者 盼小辉丶 所有, 如有侵权,请联系我们删除。

“Keras深度学习实战(26)——文档向量详解”的评论:

还没有评论