一句话总结人工智能技术那就是:道可道,非常道。第一个“道”指的是世界存在客观规律;第二个“道”指的是这些规律可以被人类识别,掌握;第三个“道”指的是认知方法,而“非常道”指的是特殊的不同的认知方法。
人类本能基于因果论来认知世界。我们的逻辑推导基于”因为…所以…”这样的模式,传统代码的编写思维是”if…else…then…”,在牛顿经典力学范畴下因果论的思维非常有用。但如果进入到相对论,特别是量子力学的世界,因果论就会完全失效。稍微了解量子力学的人都知道“海登堡测不准原理”,在量子世界里,你的观察会扰乱量子运行机制,你看和不看会产生两种截然不同的结果,因此在无法观测的情况下,因果论就无法发挥作用。在信息技术领域,也有很多无法用因果论来描述的对象,例如你如何识别图片中的物体是猫还是狗,你如何让计算机识别一句话的真正含义,例如女人对男人说“到时候你跟我等着要不然你就给我等着”,你如何让它像人类那样意识到两个“等着”拥有决然不同的含义,你永远无法使用“if..else…then…”这种方式去指导计算机认知这些非结构化数据。
世界的本质规律体现在概率与统计。在量子力学的世界里,事情的发生根本没有原因,但是它却遵循严格的概率和统计学现象,一个光子如何自旋,它如何选择一条从A到B的道路,你无法确切的知道,但是它一定以严格的概率产生一种特定情况。任何有规律的事物必然在统计上展现其特性,丢一枚硬币,你无法确定知道那一面朝上,但如果你丢一万次,十万次,你一定能确切的知道正面和负面朝上的次数越来越接近二分之一。所以对于那些无法用因果论描述,或是用”if…else…then”来指导计算机的但又包含规律的现象,使用概率和统计就是最完美的武器。
我们如何教会计算机识别一个词,一句话,乃至一篇文章的特定含义呢。一个简单却非常有效的做法是,统计特定词出现的次数。这里就涉及到如何对语言进行量化,假设我们处理的是英文句子或文章,根据统计最常用的英语单词不超过3000个,于是在识别一篇文章时,我们就创建一个包含3000个元素的向量,每个元素对应特定单词,然后统计文章中相应单词出现的次数,然后将其次数设定到含有3000个元素的向量特定分量上,于是一篇文章就转换成了一个大向量,里面有很多0,非0元素出现的比较少。不要看这种做法似乎很简单但却非常有效,垃圾邮件的过滤所依靠的正是这种技术。
通过这种方法对文章或语言进行量化,我们就能对其进行代数运算。两篇文章转换成了两个含有3000个元素的向量,那么通过计算两个向量的欧几里得距离,我们就能知道这两篇文章含义是否相同。例如三篇文章第一和第二篇将有关足球的内容,第三篇将游泳的内容,那么前两篇对应的向量距离就比第一三两篇对应的向量距离要小,这种通过对单词进行统计而形成的向量叫做bag-of-word,它是自然语言处理中一个非常关键的概念。由于每个分量的取值有无限多种,但是其中能对应有意义文本的向量可能只有一小部分,我们称这部分向量的集合为vector space,也就是语义向量空间。
python给我们提供了很好的方法来将语句转换为对应向量,例如:
from collections import Counter
Counter("My name is Tylor and I like my name".split(*))
运行后会得到如下结果:
Counter({'I': 1,
'My': 1,
'Tylor': 1,
'and': 1,
'is': 1,
'like': 1,
'my': 1,
'name': 2})
将文章或句子中的单词进行统计,最后得到一个向量的方法也叫向量模型。向量模型一个问题就在于它忽略掉了单词的排列次序,而排列次序隐含着语法规则。好在对于一些比较短的句子而言,单词排列次序并不重要,因为无论单词如何排列我们都能猜出其意义。例如”Tylor my is name”,只要稍微有点英语常识你都能得出这些单词排列的意思,使用如下代码能产生可能的各种排列:
from itertools import permutations
[" ".join(word) for word in permutations("My name is Tylor".split(), 4)]
代码运行后我们会得到单词的各种组合:
'My name is Tylor',
'My name Tylor is',
'My is name Tylor',
'My is Tylor name',
'My Tylor name is',
'My Tylor is name',
'name My is Tylor',
'name My Tylor is',
'name is My Tylor',
'name is Tylor My',
'name Tylor My is',
'name Tylor is My',
'is My name Tylor',
'is My Tylor name',
'is name My Tylor',
'is name Tylor My',
'is Tylor My name',
'is Tylor name My',
'Tylor My name is',
'Tylor My is name',
'Tylor name My is',
'Tylor name is My',
'Tylor is My name',
'Tylor is name My'
无论何种组合,对人而言都不难猜出对应含义,至少你很可能会觉得他们都表示相同含义,因此即使在失去单词排列信息的情况下,使用向量对句子或文章进行编码也能在一定程度上保留其本义。然而单词排列次序对应的语法含义依然非常重要,如果后面我们要开发一个自动对话机器人,那么句子中单词的排列秩序就非常关键。
抓住语言数量化也就是向量化这一关键后,我们看看要构建自然语言应用,例如对话机器人,问答系统等的一般步骤。首先是对输入文本进行分词,将文本分解成一系列单词的集合,这一步对英语而言比中文简单很多。接着是分析,通过对文章或句子进行向量化后,对其特性进行分类或计算,例如计算他的情绪,语法特性或语义特性。第三步是生成,使用模板,搜索或语言模型在第二步计算的基础上构建新一系列文本或句子。第四,根据统计或其他信息从构建的文本中选择合适的一个作为回应,后续我们会看到一系列步骤如何实施。
后续章节中,我们将根据如下流程进行解析,一步步搞懂自然语言处理的相关算法和技巧:
更多视频讲解请点击‘阅读原文’