Word2Vec原理以及实战详解

news2024/11/24 22:55:23

文章目录

  • 前言
  • 0、序言(词嵌入介绍)
  • 一、Word2vec详解。
  • 二、CBOW 和 Skip-Gram详解。
    • 2-1、CBOW模型:(已知周围词预测中心词)
    • 2-2、Skip-Gram模型(已知中心词预测周围词)
    • 2-3、词嵌入的缺点
  • 三、Word2vec实战(使用Gensim包)
    • 3-1、Gensim包概述以及API介绍
    • 3-2、实战
  • 总结


前言

这里什么玩意都没有。

0、序言(词嵌入介绍)

  • 在进行自然语言处理任务之前,我们首先需要将句子中一个个词语转变为数值型的输入,(即词向量:一个词的向量表示)
  • 最初的词向量是由one-hot进行编码表示的,这种方式通俗易懂,即代表一个词的0-1列表只有1个位置为1,其他位置为0。
    比如:su [0, 0, 1] yan[1, 0, 0] yang[0, 1, 0]
    这种方式占用内存大,且词语之间没有语义关联。(上面的例子代表着一个包含三个单词的词典,所以词典长度为3,每一个位置代表一个词)
  • 为了克服onehot表示的两个缺点,词嵌入(wrod embedding)应运而生,词嵌入的原理是将高维词向量(一般指的是one-hot编码)嵌入一个低维空间中去,同时,低维空间的词向量还能表达出一些语义。比如,词的相似性(similarity)或者一对词与一对之间的类比关系(analogy)。
    在这里插入图片描述

一、Word2vec详解。

word2vec的模型结构如下(词嵌入的一种)
在这里插入图片描述
词向量: 模型输入的是One-Hot Vector,隐藏层并没有激活函数,只是线性的单元,输入层维度和输出层维度是一样的,使用的是Softmax回归,模型训练完成后,我们需要的是这个模型通过训练数据所学到的参数。而这些参数,就是输入x的向量化表示,这个向量便是词向量。

Word2vec主要分为两种模型:Skip-gram模型和CBOW模型。
Skip-gram模型是用一个词语作为输入,来预测它周围的上下文。(已知中心词预测周围词)其中设置的参数window-size主要决定了目标词会与多远距离的上下文产生关系,CBOW同理。
在这里插入图片描述

CBOW模型是拿一个词语的上下文作为输入,来预测这个词语本身。
在这里插入图片描述

二、CBOW 和 Skip-Gram详解。

2-1、CBOW模型:(已知周围词预测中心词)

在这里插入图片描述
流程:输入为上下文单词的one-hot编码,之后乘以共享的输入权重矩阵W,所得到的向量相加求平均作为隐层向量,乘以输出权重矩阵W’,得到的向量经过激活函数的处理得到一个V维的概率分布,其中每一维代表的是一个单词,概率最大的是预测出来的中间词。
使用梯度下降来更新W和W’。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量就是word embedding。(已知周围词预测中心词)

2-2、Skip-Gram模型(已知中心词预测周围词)

周围词y只有一个(最简单情况):x是word2vec的输入one-hot编码,y是在这V个词输出的概率。
在这里插入图片描述
周围词y有多个(一般情况):即单个x对应多个y。
在这里插入图片描述

2-3、词嵌入的缺点

  • 由于词和向量是一对一的关系,所以多义词的问题无法解决。
  • Word2vec 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化

三、Word2vec实战(使用Gensim包)

3-1、Gensim包概述以及API介绍

  • 是一款开源的第三方python工具包, 主要用来以无监督的方式从原始的非结构化文本中学习到文本隐藏层的主题向量表达,支持包括TF-IDF、LSA、LDA和word2vec在内的多种模型算法。
  • 使用Gensim训练Word2vec步骤如下:
    1、将语料库预处理:一行一个文档或句子,将文档或句子分词(以空格分割,英文可以不用分词,英文单词之间已经由空格分割,中文预料需要使用分词工具进行分词,常见的分词工具有StandNLP、ICTCLAS、Ansj、FudanNLP、HanLP、结巴分词等);
    2、将原始的训练语料转化成一个sentence的迭代器,每一次迭代返回的sentence是一个word(utf8格式)的列表。可以使用Gensim中word2vec.py中的LineSentence()方法实现;
    3、将上面处理的结果输入Gensim内建的word2vec对象进行训练即可:
  • word2vec API介绍:
# sentences:可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或lineSentence构建。
# size:是指词向量的维度,默认为100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。
# window:窗口大小,即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为c。window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。个人理解应该是某一个中心词可能与前后多个词相关,也有的词在一句话中可能只与少量词相关(如短文本可能只与其紧邻词相关)。
# min_count: 需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。可以对字典做截断, 词频少于min_count次数的单词会被丢弃掉。
# negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。
# cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示,默认值也是1,不推荐修改默认值。
#  iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。
# alpha: 是初始的学习速率,在训练过程中会线性地递减到min_alpha。在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,默认是0.025
# min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。
# max_vocab_size: 设置词向量构建期间的RAM限制,设置成None则没有限制。
# sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
# seed:用于随机数发生器。与初始化词向量有关。
# workers:用于控制训练的并行数。

class Word2Vec(utils.SaveLoad):
    def __init__(
            self, sentences=None, size=100, alpha=0.025, window=5, min_count=5,
            max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001,
            sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,
            trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH):

3-2、实战

texts
在这里插入图片描述
vocabs(经过分词后即将要给到word2vec的对象)
在这里插入图片描述

# vocab在这里是一个无数分词后的列表组成的集合
vocabs = []
max_len = 0
for s in texts:
    tokens = list(jieba.lcut(s))
    vocabs.append(tokens)
    if len(tokens) > max_len:
        max_len = len(tokens)
# 参数好像和上边的介绍不太一样,emm,灵活使用吧,看版本号。
# vector_size:vector_size 是Word2Vec将单词映射到的N维空间的维数(N)就是说用N个特征来表示这个词向量
# min_count:min_count用于修剪内部字典。在十亿个单词的语料库中只出现一次或两次的单词可能是错别字和垃圾信息。此外,没有足够的数据来对这些单词进行任何有意义的训练,因此最好忽略它们

model_own = Word2Vec(sentences=vocabs, vector_size=100, sg=1, min_count=1)
# 模型保存
model_own.save("word2vec.model")
# 模型加载
new_model = Word2Vec.load('word2vec.model')
# 增量训练,total_examples:句子数;epochs:迭代次数
model_own.train(vocabs, total_examples=24162, epochs=10)

# model_own.wv: 向量表示,可以使用迭代器来输出所有向量表示。
# model_own.wv[char]: 获取某个词语的词嵌入表示

其他功能:语义推断。

model.most_similar(positive=['woman', 'king'], negative=['man'], topn=1)
[('queen', 0.50882536)]
model.doesnt_match("breakfast cereal dinner lunch";.split())
'cereal'
model.similarity('woman', 'man')
0.73723527
model.most_similar(['man'])
[(u'woman', 0.5686948895454407),
 (u'girl', 0.4957364797592163),
 (u'young', 0.4457539916038513),
 (u'luckiest', 0.4420626759529114),
 (u'serpent', 0.42716869711875916),
 (u'girls', 0.42680859565734863),
 (u'smokes', 0.4265017509460449),
 (u'creature', 0.4227582812309265),
 (u'robot', 0.417464017868042),
 (u'mortal', 0.41728296875953674)]

参考链接:
通俗理解word2vec.
word2vec 中的数学原理详解.
[NLP] 秒懂词向量Word2vec的本质.
【转】深度学习word2vec笔记之基础篇 .
Word2Vec-——gensim实战教程.
词嵌入 | Word embedding.
Word2vec.
自然语言处理库——Gensim之Word2vec.


总结

看了一眼日期,今天是双十一哎,昨天晚上和小妲己扯皮到3点,有点困。😪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[SQL]视图和权限

有时让用户看到整个基本表是不合适的,出于安全考虑,可能需要向用户隐藏特定的数据。如在instructor关系中隐藏工资值: select ID,name,dept_name from instructor;创建更符合特定用户直觉的个人化的关系集合,如学生成绩表由学生关…

一文学会JavaScript计时事件

文章目录JavaScript 计时事件setInterval() 方法clearInterval() 方法setTimeout() 方法clearTimeout() 方法JavaScript 计时事件 通过使用 JavaScript,我们有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时…

Linux--基础命令

一、Linux指令 mkdir(Make Directory):在当前路径下新建一个目录 -p --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录; ls(List…

Day796.什么是线程数据的强、弱一致性 -Java 性能调优实战

什么是线程数据的强、弱一致性 Hi,我是阿昌,今天学习记录的是关于什么是线程数据的强、弱一致性。 一致性,其实在系统的很多地方都存在数据一致性的相关问题。 除了在并发编程中保证共享变量数据的一致性之外,还有数据库的 ACI…

Autosar基本概念详细介绍

Autosar的由来 在汽车创新应用不断涌现的推动下,当代汽车电子电气(E/E—Electronic/Electrical)架构已经非常复杂,需要有创新的技术突破才能有效地进行管理,满足日益增长的乘客需求和法律要求。这个需求对汽车制造商及…

记一次简单的HTTP绕WAF

0X01 基础知识 关于WAF的问题? 它是我们日常攻防演练必会遇见的,在IOS七层模型中,WAF分为网络层、应用层的,当然还有云 WAF(CDNWAF)这新型类场景的。不同环境下我们绕过WAF的思路也是有所区别的&#xff…

mybatis单框架通用mapper使用(二)

mybatis单框架通用mapper使用(二) 1 查询 1.1 简单查询 1.1.1 查多条 a 用法 接口引用.select(实体类对象引用); //里面实体类对象,里面不为null值的部分就会作为条件被查询,多个条件使用and进行拼接起来 //传入为null就是查询全部的值b 测试代码 Testpublic void t2(){Sq…

直播带货系统源码,居家“神器”不出门就能购物

如今,直播带货的火爆程度已经超出了人们的想象。线下销售行业的卖家也开启了直播带货模式,直播带货的的火爆归根到底还是消费者的购物方式发生的变化。从传统的线下购物到电商购物,再到今天的直接直播带货。从各大数据可以总结,消…

应用密码学期末速通复习

文章目录模运算分数求模负数求模gcd最大公约数逆元分组密码DES加密AES加密操作模式ECB电子密码本CBC分组链接CFB密码反馈OFB输出反馈序列密码A5-1算法RC4算法Hash函数Md5算法SHA-1算法消息认证数字信封公钥密码背包公钥算法RSA公钥算法Rabin公钥算法ElGamal公钥算法ECC公钥算法…

C/C++刷题DAY2

1.第一题 27. 移除元素 - 力扣(LeetCode) 分析:对于此题,我们使用双指针的方式去写它,需要注意空间复杂度是O(1),时间复杂度也是尽量的越低越好,要去需要原地修改数组&a…

Matplotlib设置刻度和刻度标签

Matplotlib在我们之前的所有例子中都自动接管了轴上间隔点的任务。Matplotlib的默认刻度定位器和格式化器在很多常见情况下通常都足够了。可以明确提及刻度线的位置和标签以满足特定要求。 xticks()和yticks()函数将列表对象作为参数。列表中的元素表示将显示刻度的相应操作的位…

nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇

文章目录前言一、对上一篇博文的分析二、配置文件分析1. nginx 官方网址(很详细)2、配置文件(全)3、配置文件(去掉注释)4、讲解a、nginx 配置文件有三部分组成b、全局块c、events块d、http块5、http块中loc…

无脚本自动化测试

在当今的企业环境中,软件测试不再被视为不必要的投资;相反,它已经上升到一种需要而不是奢侈品的水平。随着市场的不断变化和竞争的加剧,企业必须做一些让他们与竞争对手区分开来的事情。 为了使自己与众不同,公司必须…

Dockerfile

Dockerfile指令集 对于Dockerfiel而言,是在学习docker工具里面,最重点的内容,它可以帮助我们生成自己想要的基础镜像。部署一个容器最重要的就是镜像,指令都已经内置好了。 FROM 这个镜像的妈妈是谁?&a…

数据结构每日亿题(四)

复制带随机指针的链表 原题传送门:力扣 题目: 这题的大概意思就是: 有这样一个链表,他比普通的链表多一个成员变量:random指针,这个random指针指向的是这个链表中随机一个地方,这个地方是其它节…

NetSim网络仿真使用及静态路由配置

🍰 个人主页:__Aurora__ 🍞如果文章有什么需要改进的地方还请各位大佬指正。 🍉如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️ NetSim网络仿真使用及静态路由配置。 实验要求及其步骤 使用Boson N…

Java面试笔记:Java线程安全的集合类有哪些?线程不安全的集合类有哪些?ArrayList为什么会发生并发修改异常?

一、Java的集合类有哪些? 二、如何定义集合是线程不安全的? 当多个并发同时对线程不安全的集合进行增删改的时候会破坏这些集合的数据完整性,例如:当多个线程访问同一个集合或Map时,如果有超过一个线程修改了A…

3A企业认定有哪些好处?

企业参与申报和认证有什么益处?这个问题可能应该是广大企业参与前最为关心的问题之一了 1、可快速有效提升企业资质、获得国家政府的认可;并将获得由商务部颁发的具有统一编号的牌匾和证书。 2、是企业履约能力、投标信誉、综合实力与竞争力的体现&…

数学建模--优化类模型

目录 一、根据目标函数约束条件类型分类 1、线性规划 ①线性规划模型的一般形式 ​②用MATLAB优化工具箱解线性规划 ③模型分析 2、非线性规划 ①非线性规划的基本概念 ②非线性规划的基本解法 ③二次规划 ④一般非线性规划 二、控制变量类型分类 1、整数规划 …

总结线程安全问题的原因和解决方案

一. 线程安全问题 概念 首先, 线程安全的意思就是在多线程各种随机调度的情况下, 代码不出现 bug 的情况. 如果在多线程调度的情况下, 出现 bug, 那么就是线程不安全. 二. 观察线程不安全的情况 下面我们用多线程来累加一个数, 观察线程不安全的情况: 用两个线程, 每个线程…