自然语言处理实战
上QQ阅读APP看书,第一时间看更新

1.5 超空间简述

在第3章中,我们将介绍如何将词合并到更小的向量维数中,以缓解维数灾难问题,并可能为我所用。当将这些向量相互投影以确定向量对之间的距离时,这将是对它们语义相似性而不是统计性词用法的合理估计。这个向量距离度量方法称为余弦距离,我们会在第3章中讨论这一距离,然后在第4章中展示它在降维后的主题向量上的真正威力。我们甚至可以将这些向量投影到二维平面上(更准确的说法是嵌入),以便在图表中对它们进行观察,看看我们的大脑是否能从中找到某些模式。然后,我们可以教计算机识别这些模式,并以反映产生这些向量的词的隐性含义的方式对其进行处理。

想象一下人类可能会写的所有推文、消息或句子。尽管我们确实会不断重复自己写过的东西,但仍然有太多的可能性。当这些词条分别被视为单独的、不同的维度时,我们并不知道“Good morning, Hobs”与“Guten Morgen, Hannes”其实具有相同的含义。我们需要为消息创建一些降维的向量空间模型,这样就可以用一组连续(浮点)值来标记它们。我们可以根据主题和情感等特点对消息和文字进行评级。这样,我们就可以问下面这样的问题:

  • 这条消息有多大可能成为一个被提问的问题?
  • 这条消息有多大可能是和人有关的?
  • 这条消息有多大可能是关于我自己的?
  • 这条消息听起来愤怒或高兴的程度有多高?
  • 这个问题是否需要我做出回复?

想想我们能赋予语句的所有评级,我们可以把这些评级按顺序排列,然后为每条语句计算评级,从而为每条语句生成一个向量。我们能为一组语句给出的评级列表或维度应该比可能的语句数量小得多。对于上述所有的问题,意义相同的语句应该有相似的分值。

这些评级向量变成了机器可以编程进行回复的对象。我们可以通过对语句聚类(聚集)进一步简化和泛化向量,使它们在某些维度上接近,而在其他维度上不接近。

但是,计算机应该如何为这些向量的每一个维度赋值呢?我们把向量维度的问题简化成“它包含good这个词吗?”“它包含morning这个词吗?”等问题。我们可以看到,这里可以提出100万个左右的问题,这就是计算机可以分配给一个短语的数值范围。这是第一个实际的向量空间模型,称为位向量语言模型,或者说是独热编码向量的求和结果。我们可以看到,为什么计算机现在变得越来越强大,足以理解自然语言。人类简单生成的数百万个百万维向量,在20世纪80年代的超级计算机上根本无法计算,但在21世纪的普通笔记本电脑上计算则没有任何问题。不仅仅是原始硬件的功率和容量导致NLP越来越实用,增长的常数内存、线性代数算法是机器破解自然语言编码的最后一块“拼图”。

还有一个更简单但更大的表示法可以用于聊天机器人。如果我们的向量维度完全描述了字符的精确序列会怎样?它会包含下面这些问题的答案,如“第一个字母是A吗?是B吗?……”“第二个字母是A吗?”等。这个向量的优点是,它保留了原始文本中包含的所有信息,包括字符和词的顺序。想象一下,一架钢琴一次只能演奏一个音符,它可以演奏52个或更多的音符。自然语言机械钢琴的音符是26个大写字母、26个小写字母再加上钢琴必须知道如何演奏的任何标点符号。钢琴纸卷不会比真正的钢琴宽很多,而且一些长钢琴曲中的音符数量不会超过一个小文档中的字符数量。但是,这种独热字符序列编码表示法主要用于精确记录和重放原始片段,而非编写新内容或提取一件作品的精髓。在这种表示法下,我们不太容易将某一首歌的钢琴纸卷与另一首歌的相比。这个表示比文档的原始ASCII编码表示还要长。为了保留每个字符序列的信息,文档表示的可能数量会爆炸。这里,我们虽然保留了字符和词的顺序,但是扩展了NLP问题的维度。

在上述基于字符的向量空间中,这些文档表示不能很好地通过聚类聚在一起。俄罗斯数学家弗拉基米尔·莱文斯坦(Vladimir Levenshtein)提出了一个非常聪明的方法,可以快速地找到这个空间下序列(字符串)之间的相似性。只使用这种简单的、机械的语言视图,莱文斯坦算法就能使创建一些超级有趣和有用的聊天机器人成为可能。但是,当我们想到如何将这些高维空间压缩/嵌入到具有模糊含义的较低维空间得到所谓的主题向量时,真正神奇的事情发生了。在第4章中,当我们讨论潜在语义索引和潜在狄利克雷分配时,我们将看到隐藏在魔术师幕布后的东西,这两种技术可以创建更密集、更有意义的语句和文档的向量表示。