Word2Vec和Doc2Vec模型

2023-11-05

NLP初级教程
刘建平博客
word2vec参数调整 及lda调参
Word2vec和Doc2vec原理理解并结合代码分析
基于gensim的Doc2Vec

Word2Vec

Word2Vec是Google在2013年开源的一款将词表征为实数值向量的高效工具,采用的模型有CBOW(Continuous Bag-Of-Words,即连续的词袋模型)和Skip-Gram 两种。Word2Vec通过训练,可以把对文本内容的处理简化为K维向量空间中的向量运算,而向量空间上的相似度可以用来表示文本语义上的相似度。因此,Word2Vec 输出的词向量可以被用来做很多NLP相关的工作,比如聚类找同义词词性分析等等。

原理图

CBOW模型能够根据输入周围n-1个词来预测出这个词本身,而Skip-gram模型能够根据词本身来预测周围有哪些词。也就是说,CBOW模型的输入是某个词A周围的n个单词的词向量之和,输出是词A本身的词向量,而Skip-gram模型的输入是词A本身,输出是词A周围的n个单词的词向量。 Word2Vec最常用的开源实现之一就是gensim,网址为:http://radimrehurek.com/gensim/

gensim的安装非常简单:

pip install --upgrade gensim

gensim的使用非常简洁,加载数据和训练数据可以合并,训练好模型后就可以按照单词获取对应的向量表示:

sentences = [['first', 'sentence'], ['second', 'sentence']]
model = gensim.models.Word2Vec(sentences, min_count=1)
print model['first'] 

其中Word2Vec有很多可以影响训练速度和质量的参数。第一个参数可以对字典做截断,少于min_count次数的单词会被丢弃掉, 默认值为5:

model = Word2Vec(sentences, min_count=10)

另外一个是神经网络的隐藏层的单元数,推荐值为几十到几百。事实上Word2Vec参数的个数也与神经网络的隐藏层的单元数相同,比如size=200,那么训练得到的Word2Vec参数个数也是200:

 model = Word2Vec(sentences, size=200)

以处理IMDB数据集为例,初始化Word2Vec对象,设置神经网络的隐藏层的单元数为200,生成的词向量的维度也与神经网络的隐藏层的单元数相同。设置处理的窗口大小为8个单词,出现少于10次数的单词会被丢弃掉,迭代计算次数为10次,同时并发线程数与当前计算机的cpu个数相同:

model=gensim.models.Word2Vec(size=200, window=8, min_count=10, iter=10, workers=cores)

其中当前计算机的cpu个数可以使用multiprocessing获取:

cores=multiprocessing.cpu_count()

创建字典并开始训练获取Word2Vec。gensim的官方文档中强调增加训练次数可以提高生成的Word2Vec的质量,可以通过设置epochs参数来提高训练次数,默认的训练次数为5:

x=x_train+x_test
model.build_vocab(x)
model.train(x, total_examples=model.corpus_count, epochs=model.iter)

经过训练后,Word2Vec会以字典的形式保存在model对象中,可以使用类似字典的方式直接访问获取,比如获取单词“love”的Word2Vec就可以使用如下形式:

model[“love”]

Word2Vec的维度与之前设置的神经网络的隐藏层的单元数相同为200,也就是说是一个长度为200的一维向量。通过遍历一段英文,逐次获取每个单词对应的Word2Vec,连接起来就可以获得该英文段落对应的Word2Vec:

def getVecsByWord2Vec(model, corpus, size):
    x=[]
    for text in corpus:
        xx = []
        for i, vv in enumerate(text):
            try:
                xx.append(model[vv].reshape((1,size)))
            except KeyError:
                continue
        x = np.concatenate(xx)
    x=np.array(x, dtype='float')
    return x

需要注意的是,出于性能的考虑,我们将出现少于10次数的单词会被丢弃掉,所以存在这种情况,就是一部分单词找不到对应的Word2Vec,所以需要捕捉这个异常,通常使用python的KeyError异常捕捉即可。 基于上述的Word2Vec的方法,Quoc Le 和Tomas Mikolov又给出了Doc2Vec的训练方法。如下图所示,其原理与Word2Vec相同,分为Distributed Memory (DM) 和Distributed Bag of Words (DBOW)。
在这里插入图片描述

以处理IMDB数据集为例,初始化Doc2Vec对象,设置神经网络的隐藏层的单元数为200,生成的词向量的维度也与神经网络的隐藏层的单元数相同。设置处理的窗口大小为8个单词,出现少于10次数的单词会被丢弃掉,迭代计算次数为10次,同时并发线程数与当前计算机的cpu个数相同:

model=Doc2Vec(dm=0, dbow_words=1, size=max_features, window=8, min_count=10, iter=10, workers=cores)

其中需要强调的是,dm为使用的算法,默认为1,表明使用DM算法,设置为0表明使用DBOW算法,通常使用默认配置即可,比如:

model = gensim.models.Doc2Vec(size=50, min_count=2, iter=10)

Doc2Vec

与Word2Vec不同的地方是,Doc2Vec处理的每个英文段落,需要使用一个唯一的标识标记,并且使用一种特殊定义的数据格式保存需要处理的英文段落,这种数据格式定义如下:

SentimentDocument = namedtuple('SentimentDocument', 'words tags')

其中SentimentDocument可以理解为这种格式的名称,也可以理解为这种对象的名称,words会保存英文段落,并且是以单词和符合列表的形式保存,tags就是我们说的保存的唯一标识。最简单的一种实现就是依次给每个英文段落编号,训练数据集的标记为“TRAIN_数字”,训练数据集的标记为“TEST_数字”:

def labelizeReviews(reviews, label_type):
    labelized = []
    for i, v in enumerate(reviews):
        label = '%s_%s' % (label_type, i)
        labelized.append(SentimentDocument(v, [label]))
    return labelized

创建字典并开始训练获取Doc2Vec。与Word2Vec的情况一样,gensim的官方文档中强调增加训练次数可以提高生成的Doc2Vec的质量,可以通过设置epochs参数来提高训练次数,默认的训练次数为5:

x=x_train+x_test
model.build_vocab(x)
model.train(x, total_examples=model.corpus_count, epochs=model.iter)

经过训练后,Doc2Vec会以字典的形式保存在model对象中,可以使用类似字典的方式直接访问获取,比如获取段落“I love tensorflow”的Doc2Vec就可以使用如下形式:

model.docvecs[”I love tensorflow”]

一个典型的doc2ver展开为向量形式,内容如下所示,为了显示方便只展示了其中一部分维度的数据:

array([ 0.02664499,  0.00475204, -0.03981256,  0.03796276, -0.03206162,
        0.10963056, -0.04897128,  0.00151982, -0.03258783,  0.04711508,
       -0.00667155, -0.08523653, -0.02975186,  0.00166316,  0.01915652,
       -0.03415785, -0.05794788,  0.05110953,  0.01623618, -0.00512495,
       -0.06385455, -0.0151557 ,  0.00365376,  0.03015811,  0.0229462 ,
        0.03176891,  0.01117626, -0.00743352,  0.02030453, -0.05072152,
       -0.00498496,  0.00151227,  0.06122205, -0.01811385, -0.01715777,
        0.04883198,  0.03925886, -0.03568915,  0.00805744,  0.01654406,
       -0.05160677,  0.0119908 , -0.01527433,  0.02209963, -0.10316766,
       -0.01069367, -0.02432527,  0.00761799,  0.02763799, -0.04288232], dtype=float32)

Doc2Vec的维度与之前设置的神经网络的隐藏层的单元数相同为200,也就是说是一个长度为200的一维向量。以英文段落为单位,通过遍历训练数据集和测试数据集,逐次获取每个英文段落对应的Doc2Vec,这里的英文段落就可以理解为数据集中针对电影的一段评价:

def getVecs(model, corpus, size):
    vecs = [np.array(model.docvecs[z.tags[0]]).reshape((1, size)) for z in corpus]
    return np.array(np.concatenate(vecs),dtype='float')

训练Word2Vec和Doc2Vec是非常费时费力的过程,调试阶段会频繁更换分类算法以及修改分类算法参数调优,为了提高效率,可以把之前训练得到的Word2Vec和Doc2Vec模型保存成文件形式,以Doc2Vec为例,使用model.save函数把训练后的结果保存在本地硬盘上,运行程序时,在初始化Doc2Vec对象之前,可以先判断本地硬盘是否存在模型文件,如果存在就直接读取模型文件初始化Doc2Vec对象,反之则需要训练数据:

if os.path.exists(doc2ver_bin):
    print "Find cache file %s" % doc2ver_bin
    model=Doc2Vec.load(doc2ver_bin)
else:
    model=Doc2Vec(size=max_features, window=5, min_count=2, workers=cores,iter=40)
    model.build_vocab(x))
    model.train(x, total_examples=model.corpus_count, epochs=model.iter)
    model.save(doc2ver_bin)

额外多提一点,实际上word2vec学习的向量和真正语义还有差距,更多学到的是具备相似上下文的词,比如“good”“bad”相似度也很高,反而是文本分类任务输入有监督的语义能够学到更好的语义表示
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Word2Vec和Doc2Vec模型 的相关文章

  • 这个 NLP 问题层次结构描述中的最大池化是什么类型

    我正在尝试实现这个描述以及我所做的 我生成了形状的 uni gram bi gram tri gram 15 512 使用填充 然后对于每个单词 我连接三个特征向量 3 512 然后我向他们申请 Globalmaxpooling1D 我不知
  • Spacy 中的自定义句子分割

    I want spaCy使用我提供的句子分割边界而不是它自己的处理 例如 get sentences Bob meets Alice SentBoundary They play together gt Bob meets Alice Th
  • 生成易于记忆的随机标识符

    与所有开发人员一样 我们在日常工作中不断处理某种标识符 大多数时候 它与错误或支持票有关 我们的软件在检测到错误后 会创建一个包 该包的名称由时间戳和版本号格式化 这是创建合理唯一标识符以避免混淆包的一种廉价方法 例子 错误报告 20101
  • 如何确保用户只提交英文文本

    我正在构建一个涉及自然语言处理的项目 由于nlp模块目前只处理英文文本 所以我必须确保用户提交的内容 不长 只有几个单词 是英文的 是否有既定的方法来实现这一目标 首选 Python 或 Javascript 方式 如果内容足够长我会推荐一
  • Node2vec 的工作原理

    我一直在读关于node2vec https cs stanford edu jure pubs node2vec kdd16 pdf嵌入算法 我有点困惑它是如何工作的 作为参考 node2vec 由 p 和 q 参数化 并通过模拟来自节点的
  • 将复数名词转换为单数名词

    如何使用 R 将复数名词转换为单数名词 我使用 tagPOS 函数来标记每个文本 然后提取所有标记为 NNS 的复数名词 但是如果我想将这些复数名词转换为单数该怎么办 library openNLP library tm acq o lt
  • 快速 shell 命令删除文本文件中的停用词

    我有一个 2GB 的文本文件 我正在尝试从此文件中删除经常出现的英语停用词 我有 stopwords txt 包含这样的 a an the for and I 使用 shell 命令 例如 tr sed 或 awk 执行此操作的快速方法是什
  • 是否可以使用 Google BERT 来计算两个文本文档之间的相似度?

    是否可以使用 Google BERT 来计算两个文本文档之间的相似度 据我了解 BERT 的输入应该是有限大小的句子 一些作品使用 BERT 来计算句子的相似度 例如 https github com AndriyMulyar semant
  • AttributeError:类型对象“Word2Vec”没有属性“load_word2vec_format”

    我正在尝试实现 word2vec 模型并收到属性错误 AttributeError 类型对象 Word2Vec 没有属性 load word2vec format 下面是代码 wv Word2Vec load word2vec format
  • SpaCy 中的自定义句子边界检测

    我正在尝试在 spaCy 中编写一个自定义句子分段器 它将整个文档作为单个句子返回 我编写了一个自定义管道组件 它使用以下代码来执行此操作here https github com explosion spaCy issues 1850 但
  • 举例解释bpe(字节对编码)?

    有人可以帮忙解释一下背后的基本概念吗BPE模型 除了这张纸 https arxiv org abs 1508 07909 目前还没有那么多解释 到目前为止我所知道的是 它通过将罕见和未知的单词编码为子词单元序列来实现开放词汇表上的 NMT
  • 除非 POS 显式,否则 WordNetLemmatizer 不会返回正确的引理 - Python NLTK

    我正在对 Ted 数据集成绩单进行词形还原 我注意到一些奇怪的事情 并非所有单词都被词形还原 要说的是 selected gt select 哪个是对的 然而 involved gt involve and horsing gt horse
  • 用于词性标记的优秀 Java 库是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java文本输出中的UTF-8编码问题

    我一直致力于测试高棉语 Unicode Wordbreaker 的各种解决方案 高棉语单词之间没有空格 这使得拼写检查和语法检查变得困难 以及从旧高棉语转换为高棉语 Unicode 我得到了一些源代码 现在在线 http www white
  • FastText - 由于 C++ 扩展未能分配内存,无法加载 model.bin

    我正在尝试使用 FastText Python APIhttps pypi python org pypi fasttext https pypi python org pypi fasttext虽然 据我所知 此 API 无法加载较新的
  • 对产品列表进行分类的算法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个代表或多或少相同的产品的列表 例如 在下面的列表中 它们都是希捷硬盘 希捷硬盘 500Go 适用于笔记本电脑的希捷硬盘 120
  • 如何使用Bert进行长文本分类?

    我们知道 BERT 有 token 的最大长度限制 512 因此如果一篇文章的长度远大于 512 例如文本中有 10000 个 token 如何使用 BERT 您基本上有三个选择 您可以剪掉较长的文本并仅使用前 512 个令牌 最初的 BE
  • 使用 Huggingface 变压器仅保存最佳权重

    目前 我正在使用 Huggingface transformers 构建一个新的基于 Transformer 的模型 其中注意力层与原始模型不同 我用了run glue py检查我的模型在 GLUE 基准测试上的性能 但是 我发现huggi
  • 如何使用WordNet或与wordnet相关的类别来实现基于类别的文本标记?

    如何使用wordnet按单词类别标记文本 java作为接口 Example 考虑以下句子 1 计算机需要键盘 显示器 CPU才能工作 2 汽车使用齿轮和离合器 现在我的目标是 例句必须标记为 第 1 句话 电脑 电子键盘 电子中央处理器 电
  • 在Python中表示语料库句子的一种热门编码

    我是 Python 和 Scikit learn 库的初学者 我目前需要从事一个 NLP 项目 该项目首先需要通过 One Hot Encoding 来表示一个大型语料库 我已经阅读了 Scikit learn 关于 preprocessi

随机推荐

  • 《新程序员002》图书正式上市! 从“新数据库时代”到“软件定义汽车”

    20年前 伴随着互联网打开信息化大门 技术人成为新时代的开拓者 在时代的召唤下 CSDN于2001年推出国内首个面向IT人员的专业杂志 程序员 成为一代代开发者的技术启蒙 20年后的今天 人工智能 云计算 大数据等新兴技术被赋予撬动新一轮产
  • 最有效的方法来增加在Map中的值

    关于这个是在一个博客上看到的 就像试一下 测试结果出人意料 看到这个标题可能还是觉得有点抽象 那么首先来一段代码 int count map containsKey string map get string 0 map put strin
  • 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

    给定一个包含 n 个整数的数组 nums 判断 nums 中是否存在三个元素 a b c 使得 a b c 0 找出所有满足条件且不重复的三元组 注意 答案中不可以包含重复的三元组 例如 给定数组 nums 1 0 1 2 1 1 4 满足
  • Linux的chmod

    chmod 命令是 Linux 系统中的一个重要命令 用于更改文件或目录的访问权限 chmod 命令可以设置文件或目录的所有者 所属组和其他用户的读 写 执行权限 通过 chmod 命令 用户可以控制文件或目录的访问权限 以保护重要数据不被
  • KVM学习(一)vnc连接

    完整流程Windows连接CentOS7 这个KVM系列是我的本科毕业设计 边学边做 长期更新 1 安装vncserver 首先看下实验环境 windows上跑的vmware虚拟机 vncserver安装在虚拟机上 虚拟机已经安装好了gno
  • 游戏服务器维护是干啥的,网络游戏的服务器维护都是在做些什么?

    来 我作为前网易游戏从业人员来说说真正服务器维护时候在做什么 服务器维护分成两种 紧急维护和日常维护 1 紧急维护 紧急维护一般就是硬件故障或者严重Bug 这个时候是各个团队最紧张的时候 每个团队都忙个不停 运营团队会发布公告 安慰玩家 统
  • 黑马JAVA P174 线程池概述、线程池的7个参数详解

  • Java Spring注解二:参数请求@RequestParam和@RequestBody

    作为一名crud boy 关于web请求 接口处理基本是家常便饭 涉及到这些中间肯定少不了请求参数 毕竟要根据请求参数才能进行相应的操作 返回预想的结果 一般来说我们web请求参数是不能直接通过http请求来代码识别的 所以你必须要通过注解
  • 关于上采样方法总结(插值和深度学习)

    一 简介 上采样的技术是图像进行超分辨率的必要步骤 最近看到了CVPR2019有一些关于上采样的文章 所以想着把上采样的方法做一个简单的总结 看了一些文章后 发现上采样大致被总结成了三个类别 1 基于线性插值的上采样 2 基于深度学习的上采
  • 十大经典排序算法动画与解析

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 排序算法是 数据结构与算法 中最基本的算法之一 排序算法可以分为内部排序和外部排序 内部排序是数据记录在内存中进行排序 而外部排序是因排序的数据很大 一次不能容纳全部的排序
  • python画图

    python画图 导入模块numpy 命名为np方便后续使用 import numpy as np numpy可进行数组和矩阵运算 提供大量的数学函数库 import matplotlib pyplot as plt matplotlib是
  • 无向图邻接表的深度优先遍历(DFS)

    邻接表是图的一种链式存储结构 对图的每个顶点建立一个单链表 n个顶点建立n个单链表 头文件 Graph h ifndef GRAPH H define GRAPH H define MAXSIZE 50 typedef char Verte
  • QT+PCL+VS制作点云显示界面(彩色显示xyz点云)

    前言 最近正学习QVTKWidget插件显示点云 参考博文 https blog csdn net wokaowokaowokao12345 article details 51078495 时发现其提供的官方编译样只能例打开XYZRGB的
  • python pip在哪个文件夹运行_python pip源配置,pip配置文件存放位置的方法

    pip源配置文件可以放置的位置 Linux Unix etc pip con pip pip conf 每一个我都找了都没有 所以我是在这个文件夹中创建的pip conf文件 config pip pip conf Mac OSX Libr
  • java自定义findbugs规则_findbugs自定义规则并配置实现检测

    findbugs不过多介绍了 对于这个主题找了一些资料 没有找到一个完整的介绍 要么是介绍怎么写detector 要么就是没有完整的介绍怎么配置生效 下面主要介绍一下怎么配置其生效 至于怎么写这个detector还是有很多资料说明的 不过在
  • 51单片机I/O口灌电流、拉电流、上拉电阻的联系

    一 灌电流 拉电流 我们可以通过编写程序直接控制单片机的I O口的电平是高还是低 但是却控制不了电流的大小 而电流又涉及到了驱动能力的问题 也就是说能不能带动你所加的负载 1 1什么是灌电流 拉电流 如图1 单片机 p1 0口 输出低电平时
  • Wireless Password 【HDU - 2825】【AC自动机+状压DP】

    题目链接 好题一道 推了一会 然后计算了一下时间复杂度 差不多最坏情况是25 100 1024 26 66560000然后看了下 嗯 能搞 有搞头哈哈哈 然后写了一下 首先 WA了 发现竟然是最大极限哪儿写错了 我的个天呐 A 我们看到最多
  • Hibernate 一对一关系(基于XML)

    场景 当一个实体跟另一个实体存在一对一关系时 就可以用hibernate的one to one mapping来处理啦 本教程将会讲解如何用hibernate来解决两个存在1对1关联关系的表之间的级联save问题 本教程用到的开发工具和技术
  • 2022年全网首发

    整篇文章约2 5万字 不包含引用和连接内容 回顾过去 2019 2020年 2021年 本文的行文思路 第一部分 学习路径概览 编程语言 Linux基础 数据库入门 计算机基础 Java基础 分布式理论篇 网络通信篇 离线计算篇 消息队列篇
  • Word2Vec和Doc2Vec模型

    NLP初级教程 刘建平博客 word2vec参数调整 及lda调参 Word2vec和Doc2vec原理理解并结合代码分析 基于gensim的Doc2Vec Word2Vec Word2Vec是Google在2013年开源的一款将词表征为实