WordVec词向量空间
1. WordNet的表示
-
WordNet 一个包含同义词和上位词的词典来表示
-
下面是使用nltk中的corpus进行展示
- NLTK简介
NLTK,全称Natural Language Toolkit,自然语言处理工具包,是NLP研究领域常用的一个Python库,由宾夕法尼亚大学的Steven Bird和Edward Loper在Python的基础上开发的一个模块,至今已有超过十万行的代码。这是一个开源项目,包含数据集、Python模块、教程等;
NLTK的模块 简介:
取同义词
from nltk.corpus import wordnet as wn poses = { 'n':'noun', 'v':'verb', 's':'adj (s)', 'a':'adj', 'r':'adv'} for synset in wn.synsets("good"): print("{}: {}".format(poses[synset.pos()],", ".join([l.name() for l in synset.lemmas()])))
取上位词
from nltk.corpus import wordnet as wn panda = wn.synset("panda.n.01") hyper = lambda s: s.hypernyms() list(panda.closure(hyper))
- WordNet的缺点
- 忽视了细微的差距
- 无法保持实时更新
- 需要人工的来维持和更新
- 具有主观性
- NLTK简介
2. One-hot Vector
- 传统的单词使用离散的变量进行表示,其中One-Hot独热编码便是其中的一种(一个变量为1,其余全为0,如:[0,1,0,0,0,0]
- 缺点
- 单词向量之间是正交的,无法表示它们的相似性
- 单词量很大时,会占用很大的存储空间
3. WordVec的表示
(1)Word Vector的表示
- 分布语义表示:一个词的意义是由经常出现在附近的词所赋予的,当单词w出现在文本中时,它的上下文是出现在附近的单词集(在固定大小的窗口中)。
- 将为每个选中的单词构建一个密集向量,以便它与出现在类似上下文中的单词的向量相似
- 注:单词向量有时称为单词嵌入(word embedding)或单词表示(word representation)。它们是一种分布式表示。
(2)Word2Vec的表示
- idea
- 有大量的文本语料库
- 固定词汇表中的每个单词都用一个向量表示
- 遍历文本中的每个位置t,其中有一个中心单词c和上下文(“outside”)单词o
- 使用c和o的单词向量的相似性来计算给定c时o的概率(反之亦然)
- 不断调整单词向量来最大化这个概率
- 其中的中间产物就是Word2Vec
- 两个模型变体:
- Skip-grams (SG)
预测上下文(“外部”)词(位置独立)给定中心词 - 连续词包(CBOW)
从上下文词中预测中心词
- Skip-grams (SG)
- 计算流程
- 每个位置t= 1,…,T,预测一个窗口内固定大小m的上下文词,给定中心词 w t w_t wt
- 相似度,其中 θ \theta θ为所有可以被优化的变量
- 目标函数J( θ \theta θ)为平均负对数似然值
- 此时最大化相似度L( θ \theta θ)相当于最小化平均负对数似然值J( θ \theta θ)
- 对于每个单词使用两个向量进行表示
- v w v_w vw当w为中心词的时候
- u w u_w uw当w为上下文词的时候
- 使用softmax函数对中心词c和上下文词o进行预测
- 其中取幂使得值变成正的;
- 点积来计算两个点的相似度
- 标准化使得结果是一个概率分布
- softmax函数:max:最大化的概率最大的数 x i x_i xi的比例;soft:使得概率小的值也有一定的概率
- 优化函数
- 向量空间,注意每个单词都有两个向量的表示, θ \theta θ是对所有的这些参数进行优化
- 梯度下降
- 推导公式,两个 相似度越大,梯度越小。
- 向量空间,注意每个单词都有两个向量的表示, θ \theta θ是对所有的这些参数进行优化
- 更新方程