目前,自然语言处理本身就属于人工智能主要要解决的一个问题方向。
在自然语言处理中,将一篇文章或一段文字拆分成一条条句子的动作,称作“分句”(注意不要和语法中的分句混淆了)。所有后续对自然语言进行的各种智能处理,可以说都建立在分句准确的基础之上。有人说,分句不是很简单吗,我眼睛一扫,分分钟就把句子分开了。但这看似简单的动作,用计算机来实现也存在着不少问题。
人工智能在解决问题时,目前主要有两个方向,一个是基于“规则”的,即根据人类已有的经验总结出一些所谓的“规则”,然后让计算机根据这些规则来做相应的处理。另一类是基于统计的,就是在海量训练素材的基础上,告诉计算机哪些情况下对应的答案是什么,让计算机自己学习如何处理。
显然,一般来说第一种方法相对更准确一些,这也是人工智能领域中专家系统所采用的方法,因为专家的经验一般是比较权威、比较可信的;但也存在不足,就是当遇上没有输入过的规则,计算机往往就无法处理了。另外,每个人的知识也是有限的,加上传递损失和表达问题,很多经验规则实际上无法输入到计算机系统中去。
而第二种方法是目前比较热门的方法,其中的代表就是“深度学习”技术,核心理念是让人工智能系统自己学习各种情况的处理办法。这种方式一定要求两点:一是要有真正海量的训练数据来尽可能充分地训练人工智能系统的判断能力,二是要让人工智能系统具备自己提取事物特征的能力。而当前,这两点在现代社会已经慢慢地具备了条件,这也是人工智能在最近这些年获得大发展的重要原因。
我们回到分句这件事,先从比较简单的英文篇章的分句来看起。
上图中,简单的几句话组成了一段小短文,由于结构相对简单,这样的篇章用很简单的规则就可以进行分句了。例如,我们可以把分句的规则设定为:“按英文句点后紧跟着空白字符作为分句的规则依据”,如果用代码来表示,就是如下的代码(此处用Go语言的语法来表示,其他语言是类似的):
RegSplit(article, `\.\s+`)
这是表示将article(此处指所需分句的英语篇章)进行拆分,以英文句点加一个或多个空白字符为依据来分割。
从图中可以看到,按此规则进行的分割将成功地拆分出三句话,结果是很正确的。
但这种方法显然有缺陷,我们来看下面的例子,把三句话稍作修改:
I have a red apple. Mr. Smith has a red apple, too. Which color is your apple?
也就是说将第二句的He改成了Mr. Smith这个带有缩写的名字,如果还按刚才的规则,将会拆分出四句话,
I have a red apple.
Mr.
Smith has a red apple, too.
Which color is your apple?
这显然不是我们需要的效果。
那么按照以规则为主的人工智能方法,我们应该把规则加以修改后教给计算机。一般的处理是这样的,先把句子中类似“Mr.”这样的文字中的句点替换为一个特殊的字符,然后在处理完真正的句点分句之后再把这个特殊字符替换回句点,这样处理后,结果就可以类似下面截图中那样更好一些了。
但是,举一反三,还会有很多特殊的情况导致分句不准,例如列表事项中的“1. ”、“2. ”这种情况,多个句点连接的首字母缩略语,类似“U.S.A”这种情况,还有句点和引号同时出现在句中和句末,并且顺序有前有后的情况,除了“Mr.”还有“Dr.”、“Prof.”等很多其他缩略语,等等等等很多特殊情况。另外,并非只有句点代表着可以分句,还有其他类似问号、惊叹号、省略号这些情况也需要一一处理。
可想而知,这些情况都要妥善处理,需要专家穷尽多少种可能性,增加多少条规则。
能做到上图这样的效果,已经是非常不错了,但实际上也无法做到特别完美、十全十美,也可见分句是个看似很容易,但其实并非那么简单的事情。我们生活中这样的例子比比皆是。
那么,还有另一种基于统计的,让人工智能自行学习的方法呢?
我们不谈复杂的推导和尝试,长话短说,让人工智能系统来进行分句的问题,可以简化成让机器能够学习如何区分出一段文字内那些是“句子边界”的问题。这与上面基于规则的方法从出发点上可以说是类似的,但是用人工智能中深度学习的思维来解决的话,实现方式会有所不同。深度学习方法利用了神经网络技术,并赋予神经网络从数据中自行挖掘提取特征并经过学习不断提升计算准确性的能力。
这样我们无需用人脑、请专家来总结无数条规则,只需要以字母(字符)为单位,让人工智能系统一个个例子去学习,当一个字符周围(其实就是两边)其他的字符都是什么时,这个字符就可以被判断成句子边界。
例如,上面一开始的例子,
I have a red apple. He has a red apple, too. Which color is your apple?
我们先假设一个字符是否是句子边界,一般与它周边5个字符有关联(这个假设在实际应用中肯定不同,这里只是示例),那么我们就可以把空白字符前后各5个字符,也就是共10个字符送入人工智能的神经网络,然后把正确结果(即:是句子边界还是不是句子边界)也送入作为标准答案。例如对于第一句和第二句中的边界(一般只可能是空白字符是句子边界),那么我们会把那个空白字符前后的10个字符:
pple.He ha
这10个字符和结果“true”(表示是句子边界)送入神经网络作为一条训练数据。
而对第二个例子:
I have a red apple. Mr. Smith has a red apple, too. Which color is your apple?
我们则将
pple.Mr. S
和true作为一条训练数据送入,表示这时候该处的空白字符是句子边界。而将后面“Mr.”后面空白字符前后的10个字符:
. Mr.Smith
和false作为另一条训练数据送入,表示这时候该处的空白字符不是句子边界。
如此,如果训练数据是真正海量的话,并且神经网络设计的合理(主要是神经元的数量足够,并且网络类型和层次合理),那么该神经网络慢慢就会具备判断各种情况下句子边界的能力,并且往往还可以处理人类有时候想不到的情况,也就是说将超出大多数人的识别准确度。
这是利用人工智能来辅助进行英语分句的简单介绍,真正实际中的处理比这个要复杂的多,但基本原理是一样的。以后我们还会继续进行其他方面的介绍与分析。