【自然语言处理-2】word2vec词嵌入算法“男人”+“女人”=“爱情的坟墓”
词嵌入算法
通俗易懂的理解:
词嵌入算法就是使用一个低维度的向量来表示一个词,并且距离相近的向量在实际的词含义上也是相近的。比如:
- “男人”的向量与“女人”向量的距离,相比“男人”向量与“游戏”向量的距离,谁更近?
对我来说,“电子竞技不存在爱情”,所以后者的距离比前者更近。
* “ 男 人 词 向 量 ” + “ 女 人 词 向 量 ” ≈ “ 爱 情 的 坟 墓 ” “男人词向量”+“女人词向量”\approx“爱情的坟墓” “男人词向量”+“女人词向量”≈“爱情的坟墓”
这使得词向量具有数据运算功能。
独热编码
那么问题来了,词语怎么怎么转换成一个数学可运算的状态呢?
文本长度不确定;文本词语每次都不一样,很难有效的编码来表达文本意思
One hot 独热编码:一位有效编码,其中每一位都用来存储一种状态。
假设数据有“男”“女”两个词,那我们的独热编码就一共两位
男人 | 01 |
---|---|
女人 | 10 |
优点
将离散的文本数据都变成定长的数据,方便计算
缺点
过于稀疏,对一些新的语料的词可能,每个词向量为1位,其余全是零,长度很常见就上百万级。这就没有办法记录词与词之间的关系。
这样的话,对于数据的存储、运算都是相当困难。
分布式表示方法
分布式表示的方法来解决独热编码的问题
原理
通多对文本词的训练,将每个词都映射到比较短、稠密度高的向量上来。所有的词构成一个向量空间,通过统计学的方法来研究词之间的关系。
假设我们用以下几个维度来表示这几个人物的词。
通过上面的转换,就可以将稀疏的词向量转为稠密的向量。
把原本的词向量映射到这个相对低维空间的过程就称为词嵌入(Word Embedding)
上下文关系学习
我有一个沙雕室友王三爱学习
我有一个逗比室友李四爱学习
这两句可以看出王三和李四的词向量就很接近。这就叫上下文类似
算法原理
Word2Vec 的算法核心是神经网络算法
是包含一个隐藏层的浅层神经网络
输入层是我们去掉了某些部分的语料编码,在这里也就是 One Hot 编码,输出层的维度与输入层一样,所需要预测输出的是在输入层被去掉的部分。
所以这里有两种方案,第一个是去掉某个词,输入层是这个词的上下文,这种方法叫作 CBOW(Continuous Bag Of Word),输出层也就是要去预测这个词;第二种方案是去掉上下文,用这个词作为输入层,这种方法叫作 Skip-Gram,输出层需要预测上下文。
CBOW 模式
相当于填词游戏?
我今天____个狗
SKip-Gram模式
__ ___ 吃___
对于这个网络中,从输入层到隐藏层是没有激活函数的,也就是一个线性关系。这里需要注意的是 Word2Vec 所获得的模型并不是我们这个网络的最终结果,而是在训练完成之后,把隐藏层的权重矩阵获取出来,即形成了我们的 Word2Vec 算法的结果。
通过这个方法,我们语料中的每一个词都获得了一个预设维度的向量,由于隐藏层的维度要比 onehot 向量的维度小很多,这也起到了很好的降维作用。
优缺点
优点
- 估计准确,因为考虑了上下文,以及词语顺序
- 成功降低了向量维度
- 适配后续NPL任务,通用性强
缺点
- 不具有“渣男特质”,只能解决一对一词向量,对一词多义不好处理。
案例实战
import gensim #引入gensim
import os
import re
import sys
import multiprocessing #引入多线程操作
from time import timeclass getSentence(object):#初始化,获取文件路径def __init__(self, dirname):self.dirname = dirname
# 构建一个迭代器
def __iter__(self):for root, dirs, files in os.walk(self.dirname):for filename in files:file_path = root + '/' + filenamefor line in open(file_path):try:#清除异常数据,主要是去除空白符以及长度为0的内容s_line = line.strip()if s_line== "":continue#把句子拆成词word_line = [word for word in s_line.split( )]yield word_lineexcept Exception:print("catch exception")yield ""
if __name__ == '__main__':begin = time()#记录一个起始时间#获取句子迭代器sentences = getSentence("traindata")#训练word2vec模型 使用句子迭代器作为语料的输入,设定的最终向量长度为200维;窗口长度为15;词的最小计数为10,词频少于10的词不会进行计算;使用并行处理model = gensim.models.Word2Vec(sentences,size=200,window=15,min_count=10, workersmeans=multiprocessing.cpu_count())#模型存储,这块记得先预先新建一个model路径,或者也可以增加一段代码来识别是否已经创建,如果没有则新建一个路径model.save("model/word2vec_gensim")model.wv.save_word2vec_format("model/word2vec_org","model/vocabulary",binary=False)end = time()#输出运算所用时间print("Total procesing time: %d seconds" % (end - begin))
【自然语言处理-2】word2vec词嵌入算法“男人”+“女人”=“爱情的坟墓”相关推荐
- 自然语言处理技术之词嵌入方法-2
词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称,也是实现自然语言处理任务的基础. 目录 传统词向量特征的表示方法 1.one-hot one-hot的缺点 2.TF-IDF TF-IDF ...
- word2vec python实现_教程 | 在Python和TensorFlow上构建Word2Vec词嵌入模型
原标题:教程 | 在Python和TensorFlow上构建Word2Vec词嵌入模型 选自adventuresinmachinelearning 参与:李诗萌.刘晓坤 本文详细介绍了 word2ve ...
- 在Python和TensorFlow上构建Word2Vec词嵌入模型
本文详细介绍了 word2vector 模型的模型架构,以及 TensorFlow 的实现过程,包括数据准备.建立模型.构建验证集,并给出了运行结果示例. GitHub 链接:https://gith ...
- Word2Vec词嵌入向量延伸-原理剖析
传送:基于Hierarchical Softmax的word2vec模型原理 基于Negative Sampling的word2vec模型原理 一.基本概念准备 稀疏向量(one-hot repres ...
- 文本特征提取_02:Word2Vec词嵌入矩阵
王小草SparkML笔记 笔记整理时间:2017年1月10日 笔记整理者:王小草 今日计事: 除开上周五在家工作,2017年的工作日从3号开始今天第5次上班迟到,无论起多早每天都是会迟几分钟.第一次挤 ...
- 自然语言处理 —— 2.3 词嵌入的特性
词嵌入还有一个特性是能帮助实现类比推理,尽管类比推理可能不是自然语言处理中最重要的存在,不过它能帮助人们理解词嵌入做了什么以及词嵌入能做什么,让我们来一探究竟. 上图是一系列你希望词嵌入可以捕捉的单词 ...
- 【解释】Word2vec 词嵌入
在NLP 里面,最细粒度的是 词语,词语组成句子,句子再组成段落.篇章.文档.所以处理 NLP 的问题,首先就要拿词语开刀. 举个简单例子,判断一个词的词性,是动词还是名词.用机器学习的思路,我们有一 ...
- 【自然语言处理】Word2Vec 词向量模型详解 + Python代码实战
文章目录 一.词向量引入 二.词向量模型 三.训练数据构建 四.不同模型对比 4.1 CBOW 4.2 Skip-gram 模型 4.3 CBOW 和 Skip-gram 对比 五.词向量训练过程 5 ...
- 【自然语言处理】【词嵌入】dLCE:将词汇对比集成到近义反义的词嵌入中
Integrating distributional lexical contrast into word embeddings for antonym synonym 文章目录 Integratin ...
最新文章
- JAVA 中equals()与==的区别
- 他让张一鸣登门请教,培养出戴文渊李沐陈天奇,创建了传说中的上海交大ACM班...
- 怎么取html网页中的样式,从建站到拿站 -- HTML和CSS基础
- 数组中只出现一次的数字+第一个只出现一次的字符
- spring防止爬虫_Spring安全:防止暴力攻击
- edge浏览器扩展插件中心10月发布 可直接安装Chrome扩展
- python语义分析_Python差异的潜在语义分析
- RTMP协议学习笔记
- 【留言板 Message Board】
- 做YH更新,引发众多思考.
- 自动档汽车正确的操作方法和习惯---请教贴
- 清华计算机科学与技术专业收分,2016年清华大学计算机科学与技术专业最低分是多少?...
- django使用ajax传输数据
- 2019年PMP考试模拟题(附答案解析)
- 一款自动生成唯一头像的开源代码库
- 2019年房价调整是大概率事件,如果房价下跌,会出现什么问题?
- 微擎跳过云平台_2018年10月微擎安装之阿里云懒人教程篇
- 组网技术:ADSL+无线路由器组网实例图解(组图)
- 预防ddos攻击常用方法有哪些
- 非常实用的12条 SQL 优化方案
热门文章
- 短视频风口持续 今日头条再投10亿补贴火山小视频
- 【Redis】Failed listening on port 6379 (TCP), aborting.
- mysql8.0压缩包安装
- 陈臣java_小菜学设计模式——享元模式
- 物理建模钢琴-Modartt Pianoteq Pro v6.7.0 WiN
- TensorFlow 入门到进阶,如何快速学习?
- android平板 可以刷ios,终于跟上安卓!iPad Pro新功能曝光:系统升级方便了
- 231313132131
- angular的 #
- html多行注释正则表达式,RegEx用于匹配/替换JavaScript注释(多行和内联)