Word Embedding与Word2Vec
一、数学上的“嵌入”(Embedding)
Embed这个词,英文的释义为, fix (an object) firmly and deeply in a surrounding mass, 也就是“嵌入”之意。例如:One of the bullets passed through Andrea's chest before embedding itself in a wall.
另外,这个词(的分词形式)在数学上也是一个专有名词,Embedding,它广泛存在于包括代数、拓扑与几何等诸多数学领域。它主要表征某个数学结构中的一个实例被包含在另外一个实例中,例如一个group它同时又是一个subgroup。
当我们说某个对象 X 被嵌入到另外一个对象 Y 中, 那么 embedding 就由一个单射的、结构保持的(structure-preserving)映射 f : X → Y 来给定的。此处的结构保持的具体含义要依赖于X 和 Y 是哪种数学结构的实例而定。
举个例子:我们可以把整数“嵌入”进有理数之中。显然,整数是一个group,同时它又是有理数的一个subgroup。整数集合中的每个整数,在有理数集合中都能找到一个唯一的对应(其实就是它本身)。同时,整数集合中的每个整数所具有的性质,在有理数中同样得到了保持。同理,我们也可以把有理数“嵌入”到实数中去。
二、词嵌入(Word Embedding)
John likes to watch movies. Mary likes movies too.
John also likes to watch football games.
把上述语料中的词汇表整理出来并排序(具体的排序原则可以有很多,例如可以根据字母表顺序,也可以根据出现在语料库中的先后顺序)
假设我们的词汇表排序结果如下:
{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also":6, "football": 7, "games": 8, "Mary": 9, "too": 10}
那么则有如下word的向量表示:
[1, 2, 1, 1, 2, 0, 0, 0, 1, 1]
[1, 1, 1, 1, 0, 1, 1, 1, 0, 0]
One-hot方法很简单,但是它的问题也很明显:
1)它没有考虑单词之间相对位置的关系;
2)词向量可能非常非常长!
针对第一个问题,你可能会想到n-gram方法,这确实是一个策略,但是它可能会导致计算量的急剧增长。因为n-gram已经在之前的文章中解释过了,下面我们来看另外一个方法:共现矩阵 (Cocurrence matrix)。
一个非常重要的思想是,我们认为某个词的意思跟它临近的单词是紧密相关的。这是我们可以设定一个窗口(大小一般是5~10),如下窗口大小是2,那么在这个窗口内,与rests 共同出现的单词就有life、he、in、peace。然后我们就利用这种共现关系来生成词向量。
例如,现在我们的语料库包括下面三份文档资料:
I like deep learning.
I like NLP.
I enjoy flying.
作为示例,我们设定的窗口大小为1,也就是只看某个单词周围紧邻着的那个单词。此时,将得到一个对称矩阵——共现矩阵。因为在我们的语料库中,I 和 like做为邻居同时出现在窗口中的次数是2,所以下表中I 和like相交的位置其值就是2。这样我们也实现了将word变成向量的设想,在共现矩阵每一行(或每一列)都是对应单词的一个向量表示。
虽然Cocurrence matrix一定程度上解决了单词间相对位置也应予以重视这个问题。但是它仍然面对维度灾难。也即是说一个word的向量表示长度太长了。这时,很自然地会想到SVD或者PCA等一些常用的降维方法。当然,这也会带来其他的一些问题,例如,我们的词汇表中有新词加入,那么就很难为他分配一个新的向量。但这并非本文要讨论的重点,我们不再赘述。
- “国王” – “王后” ≈ “男” – “女”
- “英国” – “伦敦” ≈ “法国” – “巴黎” ≈ “首都”
import gensim, logging, os
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)import nltk
corpus = nltk.corpus.brown.sents()fname = 'brown_skipgram.model'
if os.path.exists(fname):# load the file if it has already been trained, to save repeating the slow training step belowmodel = gensim.models.Word2Vec.load(fname)
else:# can take a few minutes, grab a cuppamodel = gensim.models.Word2Vec(corpus, size=100, min_count=5, workers=2, iter=50) model.save(fname)
现在已经得到模型了,接下来我们来评估一下这个模型的质量。我们要评估一下下面这几个词之间的相近(或伴随)程度。
words = "woman women man girl boy green blue did".split()
for w1 in words:for w2 in words:print(w1, w2, model.similarity(w1, w2))
输出的结果如下:
woman woman 1.0
woman women 0.3451595268
woman man 0.607956254336
woman girl 0.761190251497
woman boy 0.558522930154
woman green 0.24118403927
woman blue 0.178044251325
woman did 0.0751838683173
women woman 0.3451595268
women women 1.0
women man 0.126646555737
women girl 0.292825346454
women boy 0.298552943639
women green 0.104096393379
women blue 0.0930137564485
women did 0.152766770859
注意:输出内容较长,这里不全部列出,读者可以执行尝试并观察输出结果... ...
当然,你也可能希望有一个更直观的表示,所以不妨试试图形化的结果显示:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inlineM = np.zeros((len(words), len(words)))
for i, w1 in enumerate(words):for j, w2 in enumerate(words):M[i,j] = model.similarity(w1, w2)plt.imshow(M, interpolation='nearest')
plt.colorbar()ax = plt.gca()
ax.set_xticklabels([''] + words, rotation=45)
ax.set_yticklabels([''] + words)
所绘制的结果如下:
model.most_similar(positive=['woman'], topn=10)
输出之结果如下:
[('girl', 0.7611901760101318),('man', 0.6079562902450562),('lady', 0.6069421768188477),('boy', 0.5585228800773621),('child', 0.5556907653808594),('person', 0.5444432497024536),('young', 0.5219132900238037),('pair', 0.5211296081542969),('she', 0.5175711512565613),('fellow', 0.5115353465080261)]
现在你也可以试着来玩一下Word2Vec啦!
Word Embedding与Word2Vec相关推荐
- 词嵌入来龙去脉 word embedding、word2vec
文章目录 0词嵌入来龙去脉 1 NLP的核心关键:语言表示(Representation) 2 NLP词的表示方法类型 2.1词的独热表示one-hot representation 2.2词的分布式 ...
- Word Embedding与Word2Vec学习
一.词嵌入背景 Embed这个词,英文的释义为, fix (an object) firmly and deeply in a surrounding mass, 也就是"嵌入"之 ...
- 06_1.Pytorch中如何表示字符串、word embedding、One - hot、Embedding(Word2vec、BERT、Glove)【学习总结】
1.6.1.如何表示字符串 1.6.1.1.word embedding 1.6.1.1.1.文本表示(Representation) 1.6.1.1.2.独热编码 | one-hot represe ...
- CS224n 2019 Winter 笔记(一):Word Embedding:Word2vec and Glove
CS224n笔记:Word2Vec:CBOW and Skip-Gram 摘要 一.语言模型(Language Model) (一)一元模型(Unary Language Model) (二)二元模型 ...
- 关于词嵌入(Word Embedding)的一些总结
看了课程半天没搞懂词嵌入是啥,梳理一下相关知识.参考: https://www.jianshu.com/p/2fbd0dde8804 https://blog.csdn.net/m0_37565948 ...
- (全)Word Embedding
原文链接:https://blog.csdn.net/L_R_H000/article/details/81320286 最近做完UNIT一个小项目后,结合同时期看KBQA的文章,对NLP/NLU方向 ...
- 什么是词嵌入| Word Embedding
本文参考:词嵌入 维基百科解释 In natural language processing (NLP), word embedding is a term used for the represen ...
- word2vec代码_TensorFlow2.0 代码实战专栏(四):Word2Vec (Word Embedding)
作者 | Aymeric Damien编辑 | 奇予纪出品 | 磐创AI团队 Word2Vec (Word Embedding) 使用TensorFlow 2.0实现Word2Vec算法计算单词的向 ...
- NLP(词向量、word2vec和word embedding)
最近在做一些文本处理相关的任务,虽然对于相关知识有所了解,而且根据相关开源代码也可以完成相应任务:但是具有有些细节,尤其是细节之间的相互关系,感觉有些模糊而似懂非懂,所以找到相关知识整理介绍,分享如下 ...
- Word2Vec+ Word Embedding
word2vec和word embedding有什么区别? 2018年06月18日 22:53:30 阿华Go 阅读数:1625 作者:Scofield 链接:https://www.zhihu.co ...
最新文章
- 【坑爹】WebStorm编辑器突然回车不能换行了、回车不能使用、回车失效了!!!
- 人工智能是什么?带你一次掌握人工智能的三大重点及三大领域
- python3 tcp 文件传输源码
- Py之Beautiful Soup 4.2.0:Beautiful Soup 4.2.0的简介、安装、使用方法详细攻略
- Xtreme ToolkitPro 初使用
- GraphQL:简单开开始一个查询
- java程序流程控制_java程序流程控制
- 树莓派安装smbus_树莓派使用smbus不兼容问题(no module named 'smbus')
- 【今日CS 视觉论文速览】Wed, 12 Dec 2018
- 自动轨迹绘制的python代码_python 自动轨迹绘制的实例代码
- ubuntu(jdk配置)
- 分治算法详解及经典例题
- 模块一 day09 文件操作相关
- mismatch,equal比较两序列
- 阿里云面经之实习二面
- Linux 中 find 命令如何使用,附 35 个实际例子
- VIVE™在MWC上海展示生态全景,虚拟现实行业新趋势初见端倪
- 【英文语法】英语是世界上最容易的语言(语法汇总)
- 计算机网络故障的检测与排除,计算机网络故障诊断与排除(第3版)
- 【深度森林算法实践】分类与回归
热门文章
- 1538_AURIX_TriCore内核架构_地址映射以及存储配置
- 前后落差大用什么词语_形容前后反差大的词语
- 【六】ubuntu发行版本构建工具
- Android系统中设置TextView的字符间距
- 科比投篮选择——数据采集
- 神秘的罗斯柴尔德家族
- 专访 | 为什么中国还没有区块链科技巨头和顶级公链?
- c语言函数fac,将一个求阶乘的函数fac专门写在一个文件file1.cpp中,定义为外部函数。然后在另一文件file2.cpp中...
- 网上商城所需软硬件架构分析
- 韩信点兵python源代码_Python实现“韩信点兵”