Digital World

理解 word embedding

2018/03/28 Share

使用场景

在自然语言处理中,需要对词语进行表示。在语料当中,词典通常都是非常大的,如果使用 one-hot 的格式来表示,会有巨大的维度,显得稀疏,并且词语之间的关系并没有表示出来。
这时候,会使用一个低维度(通常是300维度)的矩阵来表达词典,通过查询的方式得到某个词语的向量来表示这个词语。
word_embedding
上图表格中包含一个矩阵E,每个词语的词向量可以通过该词语的id编号,比如Apple(456),查询该矩阵当中456列的向量 [0.00, -0.01, 0.03, 0.95] 即为该词语的词向量,低频不在词典当中的词语被认为是Unkown.

这种方式有几个优点:

  1. 降低了词语的维度,提高运算效率;
  2. 词语之间的向量具有相互关系,可以用于关系推理;
  3. 有更好的泛化效果。

word embedding 就是从语料库当中进行非监督学习,得到词典的表达矩阵E的过程。

物理直觉

为什么 word embedding 可以达到这些效果呢。
这里有一个假设,在自然语言当中,词语用来表达脑海里的概念,这个概念具有什么样的属性也往往会被包含在词语所在的语言序列当中。比如:

马约翰跑完步后喜欢喝水。
马约翰跑完步后喜欢喝柠檬茶。

这两个句子可能就包含有水和柠檬茶都属于液体、能够解渴等属性。
那么,如果我们把语料库当中的词语与它们的上下文语言序列统计起来,就有可能学习到词语所具有的属性。
在大量的语料库中训练学习得到的词向量包含更多属性的信息,方便与属性相近的词向量替换,因此也有了更好的泛化效果。

实现算法

在语料库中统计词语生成词典,每个词语作为目标词向量,在语料中对该目标词向量的上下文语言序列采用不同的采样方式得到输入词向量,把输入词向量与目标词向量分别放置到神经网络的 input layer 与 output layer 当中,定义好损失函数进行训练。这个过程可以逐步训练与优化输入词向量与目标词向量。而输入词向量与目标词向量都是词典矩阵E的组成部分,多次重复后即可学习到词典矩阵。
跟上面图表所示不同,这是一个机器非监督学习词语特征的过程,因为坐标系初始随机化,坐标转换,维度变化等原因,word embedding 学习到的词向量属性并不一定是人们脑海里认知的属性,还不需要理解每个属性维度的含义。

word2vec

有CBOW和skip-gram两种类型,分别是使用目标词语的前四个词语、前后各四个词语、前一个词语、附近随机一个词语作为输入词向量。使用softmax作为输出层的判别函数进行训练。

GloVe

glove
统计了目标词语上下10个位置的词语,统计两两共同出现的频率。

fastText

facebook出的算法,有大量预训练的语料。项目地址

中文预训练语料

在工程项目中,不一定需要自己训练词向量,也可以使用其他人训练好的语料。

  • 由韩国人 Kyubyong Park 预训练的词向量语料,语言种类很多,缺点是没有区分简体中文与繁体中文。
  • 由 FaceBook 训练的词向量语料,除了维基百科,还使用了爬虫得到的语料。

网上预训练的词向量格式

1
2
千里 -0.2356 0.72061 -0.66089 -0.087147 0.47827 -0.21575 -0.27084 0.068557 0.45056 -0.22241 0.77711 0.058512 1.5203 -1.2116 0.18077 -0.4743 0.6265 -0.2624 -0.84973 -0.2602 -0.74482 0.79138 0.30854 -0.0046262 0.8185 -0.2796 0.84017 0.13187 0.84976 0.11004 0.7512 -0.56427 -0.93368 -0.60641 -0.23664 0.81413 0.88972 -0.23608 -0.06106 0.90296 0.60912 1.0172 0.76225 -0.78616 -0.2489 -0.41616 -0.66891 -0.34446 0.32363 -0.48978 0.76208 0.037954 -0.1634 -0.4695 -0.15868 -0.60449 -0.854 -1.0229 -2.7887 0.5125 0.74214 -0.23572 1.0539 0.8567 0.19528 0.74258 -0.65842 -0.54648 -0.61283 -0.26795 1.0752 -0.78035 1.1287 -0.43946 -0.66505 0.38529 -0.011688 -0.62162 -0.37402 -0.85955 -0.16812 0.00048273 0.74579 -0.66575 -0.58404 -0.78795 -0.050826 0.45432 0.22275 -0.83856 -0.61137 0.56552 -0.18735 -0.14824 -0.42942 0.67866 0.71101 0.47989 -0.057116 0.10651 0.26134 0.56626 -0.40736 0.74599 -0.44692 0.72165 -0.0055265 -0.11457 -0.58144 0.063158 -0.02671 -0.52996 -0.31657 0.49414 0.10702 0.45661 -0.80524 0.26231 -0.52103 -0.68167 -0.58398 0.65881 0.44627 0.10291 -0.66815 -0.78568 0.63507 0.50377 -0.31018 0.63805 0.73278 0.078802 -0.74203 0.33379 -0.84559 0.43539 -0.21824 -0.3892 -0.5739 -0.049838 0.043789 0.68519 0.52625 -1.1282 -0.5834 0.38329 -0.96712 -0.41181 -0.63574 0.18135 0.17868 0.64472 -0.067719 0.15472 0.49349 -0.82379 0.6188 -0.45236 0.2236 0.23656 0.63364 0.27908 0.19446 -0.037614 -0.059709 0.43691 -0.47687 0.77798 0.27494 -0.088706 0.88244 0.30691 1.0171 0.19494 0.29175 -0.027921 0.91357 1.0457 0.30796 -0.024661 -0.30323 -0.63158 0.50858 -0.19914 -0.46819 0.66477 0.14643 -0.080844 -0.54719 0.79766 -0.24831 0.33606 -0.15654 -0.020155 -0.052994 -0.18994 -0.48764 -0.77169 0.16138 0.22737 0.087767 -0.49104 0.08859 -0.5141 0.10201 0.18764 0.30838 -0.48601 -0.30269 0.66058 -0.82496 0.22933 -0.95567 0.37542 -0.64586 0.49916 0.41525 -0.19472 0.8982 0.67911 -0.47693 0.5979 0.15782 -0.51053 -0.73885 0.47245 -0.39412 0.13046 -0.84805 0.15634 -0.91102 -0.17435 0.36768 -0.80336 -0.14557 0.959 0.47628 -0.97496 -0.16158 -0.34115 0.61125 -0.32598 0.93306 -0.27826 -0.23325 -0.26098 0.010526 0.11703 -0.83798 -0.012729 -0.33648 0.11123 -0.63161 -0.077609 -0.38604 0.349 0.42539 0.53407 -1.1382 0.098649 0.31001 -0.19161 -0.26671 0.020305 -0.10808 -0.14409 -0.45957 -0.77056 -1.3306 -0.70709 0.29206 0.058487 0.98477 -0.39117 -0.15924 -0.1245 -0.25487 0.73729 0.26359 -0.52785 0.31291 0.70938 0.39383 0.43089 -0.29398 -0.15165 -0.088701 0.42627 -1.0042 0.07931 -0.37031 -0.53671 -0.22617 -0.16269 -0.10794 -0.37761 0.034404 0.33295 0.6112 0.23009
大泉 -0.43938 0.75102 -0.79258 -0.033869 0.80207 0.11222 -0.78468 -0.14963 0.22033 0.090435 1.0073 0.08761 1.0902 -1.3338 0.16943 -0.71821 0.53043 -0.3013 -1.3233 -0.74966 -0.25705 0.93329 0.5174 -0.028594 0.2964 -0.53222 0.6127 -0.11046 0.64218 0.26756 0.39425 -0.91523 -0.62157 -0.29649 -0.8189 0.60166 1.1603 -0.38306 0.24328 1.8355 0.35174 0.82425 1.27 -0.57699 -0.16151 -0.52678 -0.86896 -0.57612 0.23898 -0.64708 0.47215 -0.50174 -0.41625 -0.20258 -0.37994 -0.56071 -1.4736 -0.78147 -2.3853 0.33867 1.0088 0.093377 0.5451 0.78375 -0.12554 0.2067 -0.83637 -0.43477 -0.091675 -0.41178 1.0604 -0.52079 1.0129 -0.59557 -0.47442 0.14216 -0.11258 -1.0938 -0.20309 -0.7768 -0.49035 -0.1183 0.7359 -0.40637 -0.80346 -0.46169 0.7456 0.016973 0.7295 -0.67733 -0.75488 0.37011 -0.10289 0.4712 -0.69064 0.82465 0.60774 0.15972 0.34147 0.23024 0.1436 -0.0029408 -0.88911 1.3139 -0.19524 0.47 -0.12064 -0.4319 -0.82572 0.10856 0.32712 -0.82291 0.070233 0.39158 0.095132 0.47155 -0.30169 -0.12858 -1.0962 -0.42453 -0.4795 0.15807 0.67908 -0.05512 -0.62607 -0.45786 0.97902 0.82011 -0.78835 0.50827 0.81101 -0.45877 -0.64691 0.69794 -1.2847 0.60493 -0.62595 -0.2115 -0.7299 -0.16103 0.11022 0.66377 0.61088 -0.83237 0.016688 0.20334 -1.3988 0.017637 -0.68581 -0.16389 0.44021 0.1454 -0.62978 0.46843 0.97286 -0.2077 -0.173 -0.95133 0.56153 0.77732 0.56076 0.016002 0.22666 0.60673 -0.25315 0.058855 -0.4637 1.5216 0.53655 -0.083479 0.7921 0.38425 0.85045 0.42782 -0.18249 -0.36657 0.61276 0.66443 0.31272 -0.38128 -0.3723 -1.0139 -0.028897 0.29218 -0.058238 0.55429 0.24518 0.0073908 -0.030776 0.58496 -0.12632 -0.14651 -0.41517 0.10659 0.25634 -0.18602 -0.70542 -0.88436 -0.048674 0.30816 0.29282 0.02301 0.68818 -0.90808 0.11323 -0.12349 0.17554 -0.17841 -1.4072 0.27968 -0.82703 0.28445 -0.059332 -0.64035 -0.40218 0.37131 0.43561 -0.01959 0.62281 0.67548 -0.98797 0.31339 0.16289 -0.40761 -0.99908 1.122 -0.029588 -0.29768 -0.89939 -0.095506 -0.55349 -0.26299 0.1162 -0.33255 0.33376 0.5647 0.56076 -1.0661 -0.20902 -0.46554 0.53538 -0.6579 0.96278 -0.36452 0.63224 -0.71839 0.071234 0.15849 -0.087469 0.58669 -0.35292 -0.16647 -0.97357 0.2567 -0.36658 -0.77626 0.90065 0.073719 -0.77984 0.21778 0.28454 -0.8293 -0.76778 -0.16747 -0.84176 0.21803 -1.5166 -0.53974 -1.7103 -0.92617 0.53289 0.43581 1.1739 -0.68188 0.4521 -0.33902 -0.42929 0.13205 0.23441 -0.24897 0.82126 0.92791 0.73834 0.19686 -0.2532 0.27019 0.34306 0.50489 -1.2677 -0.062701 -0.31211 -1.0356 0.1863 0.12445 -0.41114 -1.0485 0.017889 -0.2289 0.60911 0.46786

如果想要使用 dict 格式读取词向量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np

def loadVector(filename):
data = {}
file = open(filename, 'r')
for line in file.readlines():
row = line.strip().split(' ')
data[row[0]] = row[1:]
print("load Vector finished.")
file.close()
return data

if __name__ == '__main__':
data = loadVector('./cc.zh.300.vec')
print(data['流鼻涕'])

CATALOG
  1. 1. 使用场景
  2. 2. 物理直觉
  3. 3. 实现算法
    1. 3.1. word2vec
    2. 3.2. GloVe
    3. 3.3. fastText
  4. 4. 中文预训练语料