我们需要一种模式匹配算法,该算法可以识别与模式匹配的字符序列或词序列,以便从较长的文本字符串中“提取”它们。构建这种模式匹配算法的简单方法是在Python中,使用一系列if/else语句在字符串的逐个位置查找该符号(单词或字符)。假设想在语句开头找到一些常见的问候语,例如“Hi”、“Hello”、“Yo”,可以按照下面的代码操作:
def find_greeting(s):
if s[0]=="H":
if s[:3] in ['Hi','Hi ','Hi,','Hi!']:
return s[:2]
elif s[:6] in ['Hello','Hello ','Hello,','Hello!']:
return s[:5]
elif s[0]=="Y":
if s[1]=='o' and s[:3] in ['Yo','Yo ','Yo,','Yo!']:
return s[:2]
return None
下面是它的运行效果:
print(find_greeting('Hi Mr.Turning!'))
print(find_greeting('Hello,Tom.'))
print(find_greeting('hello'))
print(find_greeting('HelloWorld'))
可以考哪懂啊,通过这种方式编写模式匹配算法十分烦琐。甚至效果一般,它非常脆弱,依赖字符串中字符拼写、大小写以及位置的精确表达。指定所有“分隔符”也非常棘手,这些“分隔符”包括标点符号、空白字符,或者要查找的单词两边的字符串的开头和结尾字符。
如果允许指定要查找的不同单词或字符串,而无须将其硬编码为上述Python表达式。甚至可以在单独的函数中指定分隔符,通过分词和迭代查询技术,可以在字符串的任意位置中找到待查词,但这样的工作里非常大。
幸运的是,模式匹配引擎已经被集成到大多数现代计算机语言中,它就是正则表达式。
正则表达式
正则表达式是一种用特殊的计算机语言编写的字符串,可以用于指定匹配算法。如果同样实现上述匹配模式,使用正则表达式要比编写Python代码更加强大、灵活和简洁。因此正则表达式是许多涉及模式匹配的NLP问题首选的模式定义语言。使用正则表达式的NLP应用是对原先用于编译和解释形式语言(计算机语言)的扩展。
正则表达式定义有限状态机或FSM——关于符号序列的“if-then”决策树,例如上述代码中的find_greeting()函数。序列中的符号被逐个输入FSM决策树中。对诸如ASCII字符串或一系列英语单词之类的符号序列进行处理的有限状态机称为语法。它们也被称为形式语法,以便和自然语言语法规则区分开来。
在计算机科学和数学中,“语法”一次指的是一组规则,用于确定符号序列是否是特定语言的合法成员,这些语言通常称为计算机语言或形式语言。计算机语言或形式语言是与定义该语言的形式语法匹配的所有语句集。这是一种循环定义,但有时就是数学的工作方式。
把信息提取当作机器学习里的特征提取任务
之所以从基于语法的NLP方法转向了支持基于机器学习和数据驱动的方法、再次使用硬编码(手动编写)的正则表达式和模式,是因为基于统计或数据驱动的NLP方法存在局限性。
我们希望机器学习流水线能够执行一些基本操作,例如回答逻辑问题,或根据NLP指令执行诸如安排日程等操作。但这些场景下机器学习往往达不到预期效果。我们很少有标注好的训练集,能够涵盖人们用自然语言可能剔除的所有问题的答案。另外,可以定义一组紧凑的条件检查(正则表达式)以从自然语言字符串中提取关键的信息。这种方法可以解决很大一部分问题。
模式匹配(和正则表达式)仍然是最好的信息提取办法。即使使用机器学习方法进行自然语言处理,我们也需要完成特征工程。我们需要创建词袋模型或词嵌入表示,从而将自然语言文字中近乎无限可能的语言压缩到计算机可以轻松处理的向量中。信息提取只是从非结构化自然语言数据中提取机器学习特征的另一种形式,例如创建单词模型或在该词袋模型上进行PCA。这些模式和特征也同样用于最先进的自然语言机器学习流水线。
信息提取用于找到那些我们希望聊天机器人拥有的“在嘴边但说不出来”的语句和信息。我们可以事先通过信息提取来填充知识库的内容。或者,当询问机器人问题或查询搜索引擎时,信息提取可以用来按需查找语句和信息。当提取构建知识库时,可以优化数据结构以便在更大的知识领域内更快进行查询。预构建知识库使聊天机器人能够快速响应有关更广泛信息的问题。如果信息检索是随着查询聊天机器人实时进行的,这一版被称为“搜索”。很多搜索引擎结合了这两种技术,如果查询知识图谱(知识库)找不到需要的信息,则回退到文本搜索。许多自然语言语法规则都可以使用形式语法进行编码,该形式语法旨在对词或者代表词性的符号进行操作。英语可以被认为是构成上述语言的单词和语法规则。或者可以将其视为可以说出的所有可能语句的集合,这些语句被英语使用者认为是有效的。
这带来了形式语法和有限状态机的另一个特性,它将在NLP中派上用场。计算机可以通过两种方式使用形式语法:
- 识别与该语法匹配的字符串;
- 通过该语法生成新的符号序列。
我们不仅可以使用模式(正则表达式)从自然语言中提取信息,还可以在聊天机器人中使用这些模式,从而让聊天机器人“说出”与该模式匹配的内容。
这些用于模式匹配的形式语法和有限状态机还有一些很酷的功能。一个真正的有限状态机可以保证始终在有限时间内运行(停止)。它一定会告诉我们是否在字符串中找到了匹配项。它用于不会陷入死循环,只要我们不使用正则表达式引擎的某些高级功能,这些功能允许我们“作弊”并将死循环添加到有限状态机中。
因此,我们将使用不包括“后向环视”或“前向环视”这类作弊方式的正则表达式。我们将确保正则表达式匹配器会处理每个字符并且只有当它匹配时才移动到下一个字符。