一、为什么要用词表示
既然我们想让计算机处理我们的自然语言,就要让计算机看得懂、算得了我们的语言,对吧。
那么问题来了,请算一下“男人”和“女人”两个词的相似程度。
……
发现了吧,根据常识,根本无法计算出一个结果来。
而且我们知道,计算机既然以“计算”为名,它本质上处理的还是数字,而不是中文或英文。
因此我们需要把语言中的词汇用数字来表示。
你能想出什么表示方法?
请思考一下,然后下划查看参考答案。
二、有哪些较为经典的词表示方法
1、one-hot(独热码)
这种方法首先将已有词汇编号,编成一个词典。这样每个词汇都有其独一无二的编号。
假设词典里有10个词汇(只是假设,实际上数量远比这个要大),“男人”这个词的编号是5.
那么“男人”的独热码表示就是这样一个向量:[0,0,0,0,0,1,0,0,0,0],代表着在全部的10个词汇中,“男人”这个词汇排第六。
编号不是5吗?为啥排第六?
(摘墨镜,甩头)你知道吗?在程序员的世界里,数字的开始不是1,而是0。
当然,其不足之处在于,我们依旧无法计算“男人”和“女人”的相似度。因为在这种表示中,两个词的差别只在于编号不同,而这无法体现出二者的真实含义,也就无法计算相似程度。
2、Distributional Representation(上下文词表示)
这个方法的思路是:一个词的意义可以由周围的词来表示。
什么意思?
我们说出一句话,其中的每个词之间都有或多或少的联系,也存在着一些常见、固定的搭配(比如“爱”和“你”,“喝”和“水”)。通过这些周围的词,可以在一定程度上表示该词。
举例:
比如词汇“stars”,它周围的重要词汇见下图蓝字部分:
我们统计出各个重要词出现的频度:
shining | cold | night | brightly | light | bright | seasons | risen | full |
---|---|---|---|---|---|---|---|---|
2 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
那么表示“stars”这个词的向量就是:[2,2,1,1,1,1,1,1,1]
这种表示终于有了计算相似度的条件了,就是看表示两个词的两组重要词之间的相似程度,可以转化为两组向量的余弦相似度。
Term-Term矩阵
通过滑动窗口,统计窗口内各词周围的词汇及其出现次数。就像上面的“stars”一样,看看窗口内有多少个词汇,这些词汇出现了几次。然后继续滑动窗口,继续统计。
最终得到n*n大小的矩阵。
Term-Document矩阵
统计每个词在不同文档内的出现次数。
最终得到n*d大小的矩阵。
这种矩阵在信息匹配检索上有较多的应用,可以根据某个搜索词,匹配出现过该词的网页文档。
然而这种统计表示也是有其不足之处的。一是维数太大,太占存储;二是容易造成数据稀疏,影响计算效率和结果。
三、高维稀疏→低维稠密
那么,针对以上两个问题,我们希望:高维稀疏向量→低维稠密向量
常见的有两种方法
3.1 奇异值分解
在深度学习之前,往往都是用数学方法对矩阵进行压缩。奇异值分解就是一个非常经典的方法。
3.2 词嵌入
Distributed Representation(分布式表示)
深度学习出现之后,计算机可以通过学习大量语句,来给每个词分配一个稠密向量。每个词对应一种独有的分布,就像激活神经元的不同分布一样。