用户:我不开心。
ELIZA:你认为来这里会帮助你变得开心吗
用户:我需要一些帮助,这一点似乎很确定。
ELIZA:如果你得到一些帮助,对你意味着什么
用户:也许我可以学会我妈妈相处。
ELIZA:告诉我更多关于你的家庭的事情。
用户:我妈妈照顾我。
ELIZA:你家里还有谁照顾你
用户:我的父亲。
ELIZA:你的父亲
用户:你在某些方面很像我的父亲。
—— Weizenbaum (1966)1
上面的对话来自一个早期的自然语言处理系统 ELIZA,它可以模仿一个使用当事人中心治疗法的治疗师的反应与用户进行有限的对话(Weizenbaum, 1966)1。ELIZA 是一个非常简单的程序,该程序使用模式匹配来识别像“I need X”这样的短语,并将其翻译成合适的输出,比如“What would it mean to you if you got X?”。这种简单的技术在这个领域很成功,因为 ELIZA 实际上不需要懂得什么是当事人中心治疗法。正如 Weizenbaum 所指出的那样,这是为数不多的对话类型之一,听众即使对世界一无所知也可以做出反应。ELIZA 对人类对话的模仿非常成功:许多与 ELIZA 互动的人开始相信,它真的理解他们和他们的问题,甚至即使工作人员向他们解释了程序运行原理后,许多人依然相信 ELIZA 的能力(Weizenbaum, 1976)2,甚至在今天,这种聊天机器人也是一种有趣的消遣。
当然,现代的聊天机器人也不只是消遣工具;正如我们即将在第 24 章看到的,它们可以回答问题、预订机票或寻找餐馆,这些功能都依赖于对用户意图更复杂的理解。尽管如此,ELIZA 和其他聊天机器人所使用的这种基于模式的简单方法,在自然语言处理中依然发挥着至关重要的作用。
我们将从描述文本模式的最重要工具开始:正则表达式(regular expression)。正则表达式可以用来指定我们可能要从文档中提取的字符串,从上面 Eliza 中的“I need X”的翻译,到定义 $199 或 $24.99 这样的字符串,可用于从一篇文档中提取价格表。
然后我们会转向一种被统称为文本规范化(text normalization)的任务,其中正则表达式起到了重要作用。规范化意味着要将文本转换为更方便、更标准的形式。例如,我们要做的大部分语言处理工作,都要先把单词分离出来,即分词(tokenization)任务。英语单词之间通常用空格来分隔,但仅仅使用空格并不总是足够的。New York 和 rock 'n' roll 有时会被当作一个完整的词处理,尽管它们包含空格,而有时我们也需要将 I'm 分离成 I 和 am 两个词。在处理文本或推文时,我们需要将诸如 :)
这样的表情符号或 #nlproc
这样的话题标签(hashtags)分离出来。有些语言,比如日语,词与词之间没有空格,所以分词就变得更加困难。
文本规范化的另一部分是词形还原(lemmatization)任务,该任务可以确定两个词尽管表面存在差异但具有相同词根(root)。例如:sang、sung、sings 这些词都是动词 sing 的不同形式。sing 这个词是这些词的共同词素(lemma),而一个词形还原器(lemmatizer)则从所有这些词都映射到 sing。词形还原对于处理形态复杂的语言至关重要,如阿拉伯语。词干提取(stemming)是词形还原的一种简化版本,我们主要将词尾的后缀去掉。文本规范化还包括句子分割(sensentence segmentation):使用诸如句号或感叹号的线索将文本分割成单独的句子。
最后,我们将比较单词和其他字符串。我们将引入一个叫做编辑距离的指标,它根据将一个字符串改变成另一个字符串所需的编辑次数(插入、删除、替换)来衡量两个字符串的相似度。编辑距离是一种自然语言处理的常用算法,从拼写校正到语音识别再到共指解析(coreference resolution)都会用到。