前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >揭开计算机识别人类语言的神秘面纱——词向量

揭开计算机识别人类语言的神秘面纱——词向量

作者头像
用户1682855
发布2018-06-08 11:29:26
5250
发布2018-06-08 11:29:26
举报
文章被收录于专栏:前沿技墅前沿技墅
无论是机器翻译,还是智能人工客服,你是否好奇计算机是如何识别理解人类自然语言,并给出反馈的呢?

无论是人还是计算机,对于语言的识别理解,都应该是建立在一定的语料库和语料组织规则(语法)基础上的。对于听到或看到的一句话,势必会将其先按照已知的语料和语法进行快速匹配,才能够识别理解这句话的意思,并给出相应的反馈。当然,人类可以自然识别文字和语音,在大脑中对自然语言进行快速的多样化匹配理解,并作出相应的反馈。然而,对于计算机来说,就需要将这些字符数学化才能够被识别。

下面,我们就来看一句话是怎样被数学化,最终被计算机识别的,这中间经历了怎样的发展。

  • 初心:衡量句子之间的距离

我们说,对一句话的理解,要建立在已有的语料库和语法的认知上,将接收到的句子和已知的内容匹配上,才能够理解。那么我们怎么才能判断两个句子是不是匹配呢?当匹配到什么程度的时候,我们才可以认为它们具有同样的语义呢?这个问题可以被转化为衡量句子之间距离的问题。句子之间的距离越短,相似度越高,当距离为0时,便意味着两个句子具有同样的语义。

量化句子之间的距离极为复杂,我们最直观的想法之一便是从句子,或者字符串本身入手,既然字符串的组成单元是字符,那么就把它们在字符的层级上对齐一下试试看。

编辑距离(Edit Distance)应运而生,其中最典型的一种编辑距离叫作Levenshtein距离,可以简单理解为由一个字符串转成另一个所需要的最少编辑操作次数。允许的编辑操作包括替换成另一个字符、插入一个字符或者删除一个字符。比如,kitten和sitting之间的距离是3,意味着如果我们想把kitten变成sitting,那么至少需要三步:把k替换成s,把e替换成i,再在最后插入一个g。

粗看起来,这个用简单的动态规划就可以求解的办法十分简明有效,不仅可以校正一些可能的拼写错误(比如,我们拼写tomorrow时,因为数据库里面并没有这个单词,所以输入法会给我们自动纠错成常用的较近单词tomorrow),还能处理一些模糊搜索的问题(当两个字符串里面有八成的字符都一样的时候,计算机往往认为这两句话的意思也差不太多)。然而,毫无疑问,这种算法的缺陷也显而易见,比如,cat和dog没有任何一个字母相同,需要经过三次替换,距离是3,而cat和hat两个单词则只有首位字母不同,距离是1,可是,在语义上,猫和狗明显比猫和帽子要更近一些。

于是,人们也展开了一系列将语义融入编辑距离中的尝试。开始的尝试包括给插入、删除和替换三种操作赋予不同的权重,常见的是把替换的权重加大,从而让算法倾向于替换字母越少语义越近。后来的研究也包括为每个字母之间的替换赋予不同的权重,比如在美式全键盘输入法中,因为离得近的字母更容易被输入错误,所以纠正原则可以是为键盘上离得近的字母设定更近的距离,q和w是相邻的两个键,则将其距离设置为1,相离较远的键之间的距离设置为更大的值。结合数据库里的字频往往能够给出更漂亮的纠正结果。

在一系列根据数据库本身的语义关系展开的研究中,典型的代表是在2005年,哈工大的老师们发表的《基于改进编辑距离的中文关系抽取》一文,结合1996年发表的中国同义词研究数据,设计了改进版的编辑距离,如下图所示,将语义相近的实体联系起来,以更好地计算整句语义距离。直到今天,虽然编辑距离在自然语言处理领域已经退居二线,但在一些命名实体识别的任务中我们还是会见到它的身影。

也差不多从那时候开始,人们开始琢磨着,单词这个东西在人类看着意义明确,但计算机看起来没什么意义啊,那么计算机能看懂什么呢?数字!所以,Hinton在三十多年前就提出了词向量的概念,认为每个单词都可以由一个有限维的向量表示,而向量和向量之间的距离,就是单词语义上的距离。

  • 发展:词向量

Hinton提出的想法非常自然,就是不太好计算。特征嵌入(Feature Embedding)早在矩阵分解的时候就被讨论过很多回,但是对于单词来说,拆到字母级别就不好往下拆了。

不能往下,那就先往上,假定每个单词都不一样就好,反正在量化标准里面,从枚举到比较,到可加,到可乘,四个阶级数下来,发现单词看上去也没办法比较大小,那就先枚举看看。于是就先出现了one-hot这一编码方式,意思就是如果想要表示某个数据库里面所有的单词,就数一数这里面一共出现了多少个单词(比方说有2000个),根据这个定义一个字典,然后定义一个字典大小那么长的向量,里面每个维度对应字典里的每个词,除了这个词对应维度上的值是1,其他元素都是0。这听起来大到没办法描述,其实也还好,尽管牛津字典里面有17万个单词,不过日常生活中95%的时间里,3000个单词就足够用了。1960年还有人拿50个单词写了本书呢。

用稀疏编码的办法就更好办了,第几位是1,就把它的值赋为几就可以了。比如在下面的程序里,我们也可以认为中国的值为1,美国的值为2,国旗的值为3。这样只需要用一个够大的整数,我们就可以描述所有的词向量了。在编程实践中, 用哈希表给每个词分配一个ID也是不错的办法。

中国 =[1,0,0,0,0]

美国 =[0,1,0,0,0]

国旗 =[0,0,1,0,0]

我们说,one-hot encoding就可以被理解为一个聚类分析的标签,在这里面每个单词自成一类。但在今天看来,其弊端显而易见。第一是太长太稀疏,第二是丢掉了很多信息——并不是所有的单词都是无关的。玫瑰和爱情,爸爸和妈妈,公主和王子——虽然没办法比较两个单词大小,但是在语义本体论里,单词之间是有距离的。

当然,它的优势也十分明显,闭着眼睛就能搞定编码,把计算机看不懂的字符串变成计算机看得懂的向量,至于怎么去算,丢给计算机就好了。不妨借助于人类好理解的关键字分类法想象一下,如果我们想要分析某购物系统的商品评论,每条评论里会且仅会出现good和bad两个单词之一,有good的评论就是好的评价,有bad的就是坏的评价,那么随便一个贝叶斯分类器都可以轻松完成这个分类任务。如果商品是小刀,那么再不妨假设blunt 和 sharp是除good和bad之外的另一对特征词。 如果商品是鸡蛋,那么fresh和old也许会是另一对不错的特征词。把每个单词用one-hot先编码起来,再用一些其他的方法借助任务的定义,从这个向量里面找出重要的特征,这也是我们常用的方法之一。是不是很好理解?

在用神经网络求词向量之前,一种经典的做法是统计一个词语的共生矩阵。这个矩阵里面的第i行第j列表示,在所有语料中字典里面第i个词和第j个词同时出现的次数,显然,这个矩阵的行数和列数都有整个字典那么大 。对共生矩阵做分解,我们就可以得到词向量。分解的办法有很多,比如奇异值等方法,这里不做赘述。

以这种办法,我们能够得到一个不全为零的浮点数向量来更好地表示每个词,上下文类似的词,常在一起出现的词都会更像一些。但是矩阵该稀疏还是稀疏,该高维还是高维,只是把工作量移到了矩阵分解的那一步而已。

词向量是计算机识别自然语言的基础概念,其具体使用方法和场景还有很多,本文只是简要地介绍了词向量的由来和发展,借此揭开计算机识别自然语言的神秘面纱。想要了解更多人工智能或自然语言处理的知识,可以按下阅读原文,让近期颇受关注的《深度学习核心技术与实践》,为你打开通往AI世界的那扇窗。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前沿技墅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档