大家对计算机解决各类问题的方式已经有所了解,无论是图片、声音,还是视频,也无论采用何种算法,都需要先把处理对象转换成使用数值表示的形式,计算机才能进行计算。例如,在第八章处理与图片相关的任务时,使用图片像素的RGB值或者灰度值,就可以把图片转换成计算机能够处理的数值形式。当尝试进行文本的处理和理解任务时,会面临同样的问题,所以把需要处理的文本转换成数值表示的形式,是工作能够继续的首要前提。
这一节的主要内容是讲解如何让机器理解文本的基本单元——词。那么如何用数值的形式表示这些构成文本的基本单元呢?
有两种表示词的基本方法,一种是独热表示(one-hot representation),另一种是分布式表示(distributed representation)。
独热表示比较简单,它是常用的一种词表示方法。它的直观的理解方式是这样的,首先建立一个词表,这个词表的作用可以理解为一个大词典,在文本中可能出现的所有词都被收纳到了这个词表中并按某种顺序排列,每个词都以它在词表中出现的次序作为它唯一的编号。假设词表中一共有3个词,当需要表示某一个词时,查询到它在词表中出现的位置,比如它恰好是词表中的第2个词,则把这个词表示成一个三维的向量,向量的第2个分量是1,其他的2个分量都是0,也就是(0,1,0)。
更具体一些,例如,建立了如表9-1所示的词表。那么“我”的独热表示为(1,0,0,…),“是”表示为(0,1,0,…),“中学生”表示为(0,0,0,0,1,0,…)。
表9-1
这种表示方式简单明了,再结合其他算法,可以较好地解决自然语言处理中的很多问题。但是它有两个非常明显的缺陷。一是在文本中出现的词数量会非常多,词表的容量会非常大,通常数量是以万为单位的,所以每个词的表示向量也都是数万维的向量,这在各类算法中会造成计算复杂度的急剧上升,并且会带来“维数灾难”。还有一个更重要的缺陷,这种表示方式并未考虑到词与词之间的联系。例如,“美丽”和“漂亮”是两个含义相似的词,但是它们的表示方式并不能体现出这种相似性,这相当于词的大部分信息被舍弃了,使用这样的表示进行后续的语言处理任务效果可想而知。