赞
踩
第2章 自然语言和单词的分布式表示
第3章 word2vec
第4章 word2vec的高速化
第5章 RNN
第6章 Gated RNN
第7章 基于RNN生成文本
第8章 Attention
应用场景:
理解途径——单词含义
同义词词典(thesaurus),具有相同含义的单词(同义词)或含义类似的单词(近义词)被归类到同一个组中。比如,car 的同义词有automobile、motorcar 等。
另外,同义词词典有时会定义单词之间的粒度更细的关系,比如“上位 - 下位”关系、“整体 - 部分”关系。
通过对所有单词创建近义词集合,并用图表示各个单词的关系,可以定义单词之间的联系。利用这个“单词网络”,可以教会计算机单词之间的相关性.
最著名的同义词词典是WordNet,普林斯顿大学于1985年开始开发,中收录了超过 20 万个单词。
语料库(corpus)
:大量的文本数据,由人写出来的文章,包含了大量的关于自然语言的实践知识,即文章的写作方法、单词的选择方法和单词含义等。
基于计数的方法
的目标就是从这些富有实践知识的语料库中,自动且高效地提取本质。
有名的语料库,有Wikipedia和Google News等。另外,莎士比亚、夏目漱石等伟大作家的作品集也会被用作语料库。
语料库的预处理是指,将文本分割为单词(分词),并将分割后的单词列表转化为单词 ID 列表。
def preprocess(text):
text = text.lower()
text = text.replace('.', ' .')
words = text.split(' ')
word_to_id = {}
id_to_word = {}
for word in words:
if word not in word_to_id:
new_id = len(word_to_id)
word_to_id[word] = new_id
id_to_word[new_id] = word
corpus = np.array([word_to_id[w] for w in words])
return corpus, word_to_id, id_to_word
上面的代码含义很清晰,给每个词编号,使用两个字典记录词与编号的关系。
单词的分布式表示将单词表示为固定长度的向量。这种向量的特征在于它是用密集向量表示的。密集向量的意思是,向量的各个元素(大多数)是由非0实数表示的。
分布式假设(distributional hypothesis)
:某个单词的含义由它在的上下文(语境)形成。
上下文的大小(即周围的单词有多少个)称为窗口大小(window size)
。
基于计数的方法
:对某个单词的周围出现了多少次别的单词进行计数,来表示这个单词。
例如对于下面的语料库:
You say goodbye and I say hello.
窗口大小设置为1,能对其中出现的每个单词形成下面的表示:
you | say | goodbey | and | i | hello | . | |
---|---|---|---|---|---|---|---|
you | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
say | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
goodbey | 0 | 1 | 0 | 1 | 0 | 0 | 0 |
and | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
i | 0 | 1 | 0 | 1 | 0 | 0 | 0 |
hello | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
. | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
向量[0,1,0,0,0,0,0]表示单词you。
上面的表格就被称为共现矩阵(co-occurence matrix)
。
余弦相似度(cosine similarity)
两个单词同时出现的“原始”的次数并不具备好的性质。高频词语和很多单词都会共现,但是有些高频词语本身没有过多的含义,比如the。
使用点互信息(Pointwise Mutual Information,PMI)
对原始次数进行处理。
P
M
I
(
x
,
y
)
=
l
o
g
2
P
(
x
,
y
)
P
(
x
)
P
(
y
)
PMI(x,y) =log_2 \frac{P(x,y)}{P(x)P(y)}
PMI(x,y)=log2P(x)P(y)P(x,y)
使用PMI值替换原始的次数。
P
(
x
)
P(x)
P(x)就是单词x在语料库中出现的概率,
P
(
x
,
y
)
P(x,y)
P(x,y)表示x和y一起出现的概率;分母就是语料库中不同单词的个数。
但是PMI有个问题,当两个单词的共现次数为0时,
l
o
g
2
0
=
−
∞
log_2 0 = -∞
log20=−∞。实践中会使用正的点互信息(Positive PMI,PPMI)
。
P
P
M
I
(
x
,
y
)
=
m
a
x
(
0
,
P
M
I
(
x
,
y
)
)
PPMI(x,y) = max(0, PMI(x,y))
PPMI(x,y)=max(0,PMI(x,y))
2.3.4中的共现矩阵经过PPMI处理后如下:
you | say | goodbey | and | i | hello | . | |
---|---|---|---|---|---|---|---|
you | 0. | 1.807 | 0. | 0. | 0. | 0. | 0. |
say | 1.807 | 0. | 0.807 | 0. | 0.807 | 0.807 | 0. |
goodbey | 0. | 0.807 | 0. | 1.807 | 0. | 0. | 0. |
and | 0. | 0. | 1.807 | 0. | 1.807 | 0. | 0. |
i | 0. | 0.807 | 0. | 1.807 | 0. | 0. | 0. |
hello | 0. | 0.807 | 0. | 0. | 0. | 0. | 2.807 |
. | 0. | 0. | 0. | 0. | 0. | 2.807 | 0. |
PPMI 矩阵还是存在一个很大的问题,那就是随着语料库的词汇量增加,各个单词向量的维数也会增加。其中很多元素都是0,太稀疏。这样的向量也容易受到噪声影响,稳健性差。
降维(dimensionality reduction)
:在尽量保留“重要信息”的基础上减少向量维度。从稀疏向量中找出重要的轴,用更少的维度对其进行重新表示。结果,稀疏矩阵就会被转化为大多数元素均不为0的密集矩阵。这个密集矩阵就是我们想要的单词的分布式表示。
奇 异 值 分 解(Singular Value Decomposition,SVD)
是一种降维方法。
SVD 将任意的矩阵 X 分解为 U、S、V 这 3 个矩阵的乘积,其中 U 和 V 是列向量彼此正交的正交矩阵,S 是除了对角线元素以外其余元素均为 0 的对角矩阵。
X
=
U
S
V
T
X = USV^T
X=USVT
X: m*n
U: m*m
S: m*n
V: n*n
S对角线上的元素类似矩阵的特征值,不过是非方阵的适配,称为奇异值,在矩阵S中从大到小排列,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上。可以用前 r 大的奇异值来近似描述矩阵。
所谓的特征值,可以理解成假定待处理的矩阵有若干正交的轴(也就是U矩阵中的向量),特征值就是每个轴上的权重。特征值分解得到的前 r 个特征向量,就可以近似得到这个矩阵。
U`: m*r
S`: r*r
V
‘
T
V`^T
V‘T: r*n
这样就可以使用U`每行来表示对应的新的向量。向量的维度由n维降低到 r 维。
NumPy的linalg模块中的svd方法
# SVD
# W是PPMI矩阵
U, S, V = np.linalg.svd(W)
Penn Treebank 语料库(简称为 PTB),在 word2vec 的 发 明 者 托 马 斯· 米 科 洛 夫(Tomas Mikolov)的网页上有提供。
sklearn 的randomized_svd()方法。该方法通过使用了随机数的 Truncated SVD,仅对奇异值较大的部分进行计算,计算速度比常规的 SVD 快。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。