正则表达式(简称:正则)做语义解析是一种方法经典的方法。在上世纪60年代,大量的对话系统、专家系统都是用模式匹配来做,其中正则就是一个非常实用且易学的工具。具有代表性的Eliza,在当时让大家都以为这个机器能理解自然语言,即使说明了其中的原理,也有不少人认同它的智能。这套方式一直被延续至今,基本在市面上能看到的chatbots,都或多或少的保留了正则的部分。也许说到这里,有人认为马上要介绍正则如何做对话了,这篇记录只是记录一下在工作中,正则的优势和劣势。另外基于统计的方法,这里不做说明。
正则普及性高,作为一个文本检索工具,在所有的编程语言、文本工具(包括Word)都集成了。
正则易学,“我喜欢吃(\w+)”就可以作为一个匹配模式,括号里面的文字是一个符号,用来匹配其他文字,这里可能出现的如“我喜欢吃西瓜”,“我喜欢吃蛋糕”等等,这个模式就匹配这样的文本,再把其中的西瓜,蛋糕提取出来。
正则可控性强,由于每个模式都是按照上面的方式写出来的,那么在应用的时候,就是数个模式按照一定的规则去逐个匹配,如果有错误,就遵循设定去Debug。这个也是工业界比较青睐这个方法的主要原因。
正则冷启动比较容易,在项目中,一般没有语料数据的时候,统计是无法实现的,这时候两个选项,要么人工生成语料,要么制作正则模式,如果考虑的够周密,正则的对话系统可以马上上线。
然而,正则还存在问题:
正则的逻辑比较难,虽然易学,但是要处理自然语言中复杂的文字逻辑,对设计者的逻辑要求非常高。特别是在数以千计的模式下,若是有逻辑错误,调整起来非常消耗资源。这个就是正则的主要问题,也是当时对话系统没有继续发展的主要问题。
正则并非真正理解句子,上面的例子“我喜欢吃(\w+)”也会匹配到“我喜欢吃货”。
错误的例子:
模式缺少问题