这是自然语言处理的第二期,规划是前几期都会把相关的定义简单的讲一下。自然语言处理致力于理解和生成自然语言,其中的词表示和语言模型是构建NLP的两大基础。本文系统介绍词表示方法(从离散符号到分布式向量)和语言模型(从统计方法到神经网络),为后续NLP模型打下基础。这里先讲解一部分NLP模型基础,还有一部分会留到后两期,当然你也可以直接搜索关键字定位到你想要搜索的部分。本篇文章的篇幅可能会有点长,可以先点赞收藏,方便下次阅读。
词表示的定义和目标
词表示(Word Representation),他的核心技术将自然语言中的词转化为计算机能够读得懂的含义。就是把我们的每个词转化成了一串数字,这通常会被称之为向量。如果还是不理解,那我就更直观一点。我们走进小吃街,街上的店面有很多,现在每个摊位都代表一个词。我们想让机器去看懂这些词,我们给每个摊位进行标记并且记录坐标。(向量)然后我们把卖类似食物的摊位放的更近,这样计算机就能够很好的去读懂。以上说的就是词表示最直观的思路。
词表示有两个目标:
-
计算词与词之间的相似度。
-
推测词语词之间的关系。
相似的词挨得近:因为“star
”和“sun
”在意思上很接近,所以它们在“向量地图
”上也会靠得很近;同理,“motel
”和“hotel
”也是邻居。
向量算关系:有了坐标,其实就能通过减法和加法来推断关系:
国家首都:
𝑊𝑅(𝐶ℎ𝑖𝑛𝑎)−𝑊𝑅(𝐵𝑒𝑖𝑗𝑖𝑛𝑔)≈𝑊𝑅(𝐽𝑎𝑝𝑎𝑛)−𝑊𝑅(𝑇𝑜𝑘𝑦𝑜)WR(China)−WR(Beijing)≈WR(Japan)−WR(Tokyo)
性别对等:
𝑊𝑅(𝑘𝑖𝑛𝑔)−𝑊𝑅(𝑚𝑎𝑛)+𝑊𝑅(𝑤𝑜𝑚𝑎𝑛)≈𝑊𝑅(𝑞𝑢𝑒𝑒𝑛)WR(king)−WR(man)+WR(woman)≈WR(queen)
动作类比:
𝑊𝑅(𝑤𝑎𝑙𝑘𝑖𝑛𝑔)−𝑊𝑅(𝑤𝑎𝑙𝑘)+𝑊𝑅(𝑠𝑤𝑖𝑚)≈𝑊𝑅(𝑠𝑤𝑖𝑚𝑚𝑖𝑛𝑔)WR(walking)−WR(walk)+WR(swim)≈WR(swimming)
根据上面的示例,机器就能像我们用地图找邻居,他不仅知道哪些词的意思很相似,还能知道他们直接的逻辑关系是什么?
基于词典的词表示
基于词典的词表示就是我们手动摘录之后,查找已经摘录的特定词典,查找之后会寻找一个类似的词,然后把这个类似的词给描述出来。这里需要提及一下同义词词典,比较出名的同义词词典有WordNet这种。我们寻找差不多意思的词,一般我们都会把类似的内容给归类到一起,那同义词词典本质上就是这种操作。他会把差不多意思的词归类到同一个组当中,以便后期查询。它能够帮助我们去理解“惊讶”和“诧异”他们其实是差不多,这也是他要去做的。这里还有一种就是上位词词典,这个其实就是来确定范围的。他会对原本有的词进一步去进行标注,或者同类别的整合。这里也举个例子,就比如我们把“量子计算”归类到“物理学”或者“计算机科学”中。这里就好似我们通过一个人,然后慢慢的去查询到他的家人、朋友之类的,他就会形成一个关系网,就会非常方便查询。
上面说了这么多,看似很完美实则他的缺点还是非常明显的。我们在对词典进行整理的时候,我们会不小心忽略掉一些小变化。这里一般指的是更新不及时导致的新词无法理解的情况。这种情况有一种例子就是,我们在互联网冲浪摸鱼还是在研究室里做实验报告。不管什么场景下都会时不时产生新的词汇,这种新的词汇万一没有及时的更新,或者没有对同类别的词进行补充,那他就存在这种问题。更简单的就是五年前的地图和现在所产生的地图一样吗?地图他有没有在更新?更新的地图要去更换掉?我们拿着五年前的地图想要去寻找城市里面新建好的图书馆,那完全就是不现实的。词表示能够帮助我们理解词的直接关系,这里存在的副作用看使用的场景,但是我们不能过度去依赖,不然很容易会产生一些应用的准确性和稳定性。
One-hot Representation
One-hot表示法其实还是挺相似的,就是把这个词转化为计算机能够去理解的一种方式。这里简单的来看看,比如我这里有一个词,我把这个词当作一个独立符号,然后在独立符号的基础上,我们再继续给这个词添加了一个ID。然后我们用长序列来表示这个词。在长序列中,只有那个词和ID相同的是1,其他空位都是0。
举个栗子:这里有三个词,我们给这三个词分配ID
苹果 → 1
香蕉 → 2
橙子 → 3
这里总共有三个词,独立符号分别为1,2,3。因为有3个词所以这里就会采用3维向量,一般有几个词就用几维向量。然后我们把每个词的ID对应到一个向量位置。上面也说了只有词和ID相同的为1,那么这里也是,其他空位均为0。
苹果 [1, 0, 0]
香蕉 [0, 1, 0]
橙子 [0, 0, 1]
因此,ne-hot表示法就是将每个词用一个包含0和1的向量来表示。
Distributional Representation
Distributional Representation(分布式表示)是什么?官方一点的说法就是基于词的上下文进行的词表示。这句话对萌新还是会看的比较懵,我们可以这样来理解,这里有一个词,在他的边上出现了几个词,那么出现的这几个词就用来代表这个词。这样说各位应该都能理解了。
我们如何能够知道一个词他“是什么意思”呢?这里举个例子,我们在阅读当中我们相似的一段话就会出现一些相似的词,比如说同为一类的水果,我们的香蕉苹果都是属于水果,那么我们就知道香蕉和苹果他们的意思可能是非常相似也就是说它们可能都属于一个类别,那么这个类就是水果。在特定情况下,一般不会让电脑和香蕉在同一句话里面同时出,现因为他们两个毫无关系。综上所述,如果两个词经常出现在他周围的词的边上那么它们的意思可能极其相似。
这里举一个简短的例子,那么我们先来看这段话:
小胡吃了一个香蕉哦。小陈吃了一个苹果。小李吃了一个橘子。
这是一个简单的短语。那么我们现在要去分析香蕉这个词我们能做什么呢?我们看到香蕉前后都有哪些词?就比如前后个看到了两个词。这两个词的窗口大小是等于二的。我们发现这三个词它的上下文其实是差不多的。不管是香蕉、苹果还是橘子他们的上下文都是“一个”、“吃了”。通过这个例子来看,他们非常像他周围的词所以说这里的香蕉苹果橘子。这些词可能是相似的。因为他们在类似的结构中出现过。
现在我需要画一个表格来表示刚刚我们举例的内容,这个表格其实就是叫词和词的共现矩阵。
这里的每一行都代表一个词,每一列就代表他们上下文所出现的词,然后我们格子里面有数字然后这个数字就是它出现了几次。我们看到香蕉苹果橘子它们的数量都很相似,这里也能变相说明他们词的意思是是有可能非常相似的。
这里还需要再解释窗口大小有什么作用,村民说前后看到两个词这两个词的窗口大小就是二。如果窗口更小比如说他这个词只有一那可能会更可以关注是谁动了谁。这里如果窗口变大就比如说前后是有四到六个词嗯我们就能很清楚的看到他每一句话是在说什么我们能看到很多语义信息能更快地帮助我们去理解这段话的意思。
总结:
-
分布式表示就是:一个词的“意思”可以通过它周围出现的词来决定。
-
我们可以数一数这个词旁边出现了哪些词,用一个“表格”来表示。
-
窗口越小,看的是“句子结构”;窗口越大,知道的“意思”就越多。
相似度计算方法
首先我们要了解一下什么是向量,我们为什么要去使用向量呢。上面其实也浅浅的提及了一下,我们能理解的就是向量它是一组数字。这组数字它能表达很多东西,比如我们阅读中使用的词语、电脑中的图像或者说我们给对方发送的语音甚至是更复杂的东西。我们把这些东西留有的特征转化成了这一串数字然后这一串数字就得到了向量。
点积
点积的作用其实是比较两个向量“各个方向”的一致性。我这么说可能有点不大理解那么我们这里直接看下面这个例子,计算时把每个向量位置上的数相乘然后再加起来,这就是点积的计算方法。我们上面说过三维向量那这里也就以三维向量举个例子。
比如:
向量𝐴=[1,2,3]向量A=[1,2,3]
向量𝐵=[4,5,6]向量B=[4,5,6]
那么点积就等于:
1×4+2×5+3×6=4+10+18=321×4+2×5+3×6=4+10+18=321×4+2×5+3×6=4+10+18=321×4+2×5+3×6=4+10+18=32
这里其实是非常好看的懂的就是位置一一对应然后相乘再相加其实还是非常简单的。这里我们还需要去探讨一下点击的意义是什么?
这里也就不举例了这里直接说一下我们的结果那么就是如果点积的结果越大表示这两个向量在每个维度的数值就越接近它们的特征也就越相似。点积本质上是向量相似度的一种方法他告诉你这两个向量是否在每个特征上都会一致。点积的结果越大,代表向量的相似度越高。
余弦相似度
余弦相似度的关键在于方向。那么我们上面说的点积它就是对比数值的大小,但是余弦相似度它是看我们的方向是否一致。我们可以通过计算向量之间的夹角来判定它们的相似度,但是这个方法在文本分析中非常的常见,尤其是在自然语言处理的时候我们更关心的是语言之间的语义关系,并不是词频本身的绝对值。
计算公式如下:
𝑐𝑜𝑠𝑖𝑛𝑒𝑠𝑖𝑚𝑖𝑙𝑎𝑟𝑖𝑡𝑦(𝑣,𝑤)=𝑣⋅𝑤∣𝑣∣⋅∣𝑤∣cosine similarity(𝑣,𝑤)=𝑣⋅𝑤∣𝑣∣⋅∣𝑤∣cosinesimilarity(v,w)=v⋅w∣v∣⋅∣w∣cosine similarity(v,w)=∣v∣⋅∣w∣v⋅w
v ⋅ w 是向量 v 和 w 的点积。
|v| 和 |w| 是向量 v 和 w 的模(或长度),计算公式为:
∣𝑣∣=𝑣12+𝑣22+⋯+𝑣𝑛2∣𝑣∣=𝑣12+𝑣22+⋯+𝑣𝑛2∣v∣=v12+v22+⋯+vn2∣v∣=v12+v22+⋯+vn2
这里我们来解释一下什么是余弦相似度:
余弦相似度的值范围在-1到1。
余弦相似度越接近1,说明两个向量方向是一致的,这样就能表示它们越相似。越接近-1,那么就表示他们的方向是完全相反的。
矩阵分解获得稠密向量
1. 什么是矩阵分解?
矩阵其实就像是我们平时考试的成绩单,成绩单上面有着很多的数字,一般的成绩单都是以表格为主。就比如你的英语成绩和你同学的英语成绩都在一列或者一行上,这个成绩表就是一个矩阵。矩阵解释完了后面还有分解,分解从字的意思上来看是拆分、去除等含义。可以简单来理解就是他把你的成绩单拆分开来,变成更简单的数字,这样就能够帮助我们更快速更容易理解里面的内容。
假设我有这样一个成绩单的表格:
这个表格就是类似于成绩单,他把成绩单制作成了一个表格。在这个表格里面我们想要知道我喜欢这三位学生最擅长哪个科目或者哪些科目的成绩是比较相似的,这个时候我们就能用到矩阵分解帮助我们把这个复杂的表格转化成简单的数字。通过这些数字所呈现出来的成绩,我们就能一眼知道这个学生的特点,比如它擅长的是数学还是英语之类的科目。
2. 什么是SVD?
SVD其实就是一个数学的工具,能帮助我们把表格拆成三个部分。这里举个例子,比如这里有一个比较大的蛋糕,这里将这个大蛋糕切成三块蛋糕,每一块蛋糕都能直接表达出一些比较重要的信息。
-
第一块:这里的第一块蛋糕能告诉我们这个学生的特点,就比如上面所说的。
-
第二块:这里会告诉我们科目的特点,比如试卷的难易程度,有些同学成绩偏高可能与这个有关。
-
第三块:可能会告诉我们每位学生他可能喜欢什么科目,相当于把学生还有科目放在一起查阅的意思。
3. LSI, pLSA 和 LDA:
这些是用SVD分解后的工具,它们会帮助我们做一些特别的事情,比如:
-
LSI:帮我们分析文章或者词语之间的联系,找到隐藏在背后的意思。比如,“苹果”可能既可以指水果,也可以指手机品牌。LSI可以帮我们分析这些词的“潜在意思”。
-
pLSA 和 LDA:这些算法可以帮我们分析文章的主题。比如,通过分析你读的文章,它会告诉你这篇文章讨论的主要话题是什么。
举个更简单的例子:
假设你和你的朋友们分别给你们喜欢的电影打分,表格可能长这样:
这个表格看起来很稀疏(有很多零),SVD可以帮助我们把这些零填补上,找到小明喜欢哪些电影,或者小强喜欢哪些电影。
通过SVD,我们可以把“电影A”转化为一组特征(比如“动作片”),把“小明”转化为一组数字(比如“喜欢动作片”)。这些数字叫做“稠密向量”,它们帮助我们更简单地理解这个表格里的内容。
总结一下,矩阵分解就是用一种数学方式,把复杂的东西拆开,让我们更容易理解里面的内容。SVD是做拆解的工具,LSI、pLSA和LDA是用这些拆开的信息来做更复杂分析的工具。
1.矩阵分解如奇异值分解(SVD)可以将稀疏矩阵分解为低维稠密矩阵。
2.LSI(潜在语义索引)、pLSA(概率潜在语义分析)和LDA(潜在狄利克雷分配)等算法基于SVD。
3.这些算法通过分解矩阵得到每个词的低维稠密向量表示。