自然语言解析中的歧义和共享
一般情况下的歧义和共享
考虑到您的问题比较普遍,我尽量匹配这种普遍性。
当你考虑一个映射或函数 f: A -> B
不是单射时,就会出现歧义的概念。
单射函数(也称为一对一函数)是指当a≠a'时,f(a) ≠ f(a')
。给定一个函数f,通常希望反转它:给定值域B中的元素b,你需要知道定义域A中的元素a是什么,使得f(a)=b
。请注意,如果函数不是满射(即到),则可能没有这样的元素a。
当函数不是单射时,可能有几个值a在A中使得f(a)=b
。换句话说,如果你使用B中的值通过映射f来实际表示A中的值,那么你就有了一个模糊的表示b,可能无法唯一地确定值a。
从这里可以看出,歧义的概念是如此普遍,以至于即使将其限制在计算机科学和编程领域内,也不太可能存在一个统一的知识体系。
然而,如果您希望考虑反转创建这种歧义的函数,例如计算集合
f'(b)={a∈A | f(a)=b}
或者根据某种最优性准则计算该集合中的最佳元素,则确实有一些技术可以帮助您处理那些可以分解为子问题并且经常出现相同参数的情况。然后,如果您记住了遇到的各种参数组合的结果,您就不会重复计算相同的内容(子问题被称为
memo-ized)。请注意,子问题可能存在歧义,因此某些子问题实例可能有多个答案或多个最优答案。
这相当于在需要解决具有这组参数的所有情况中共享子问题的单个副本。整个技术被称为
动态规划,难点通常在于找到正确的子问题分解方式。
动态规划主要是一种共享重复子计算的方法,以减少复杂性。但是,如果每个子计算都产生一个片段结构,该结构在更大的结构中递归重复使用以查找答案(例如图形),则
子计算步骤的共享可能导致在需要它的所有位置上也共享相应的子结构。当需要找到许多答案时(例如由于歧义),这些答案可以共享子部分。
与其找到所有答案,不如使用动态规划来找到满足某些最优性标准的答案。这要求问题的最优解使用子问题的最优解。
语言处理的情况
在语言学和语言处理方面,事情可以更具体。为此,您必须确定您正在处理的领域以及您使用这些领域的功能类型。
语言的目的是交换我们大脑中存储的信息、概念和想法,假设我们的大脑使用相同的功能来用语言表达这些想法。我必须大大简化事情(对此我很抱歉),因为这并不是一个完整的语言理论的地方,而且即使有,也会引起争议。我甚至不能考虑所有类型的句法理论。
因此,从人P到人Q的语言信息交流如下:
idea in P ---f--> syntactic tree ---g--> lexical sequence ---h--> sound sequence
|
s
|
V
idea in Q <--f'-- syntactic tree <--g'-- lexical sequence <--h'-- sound sequence
第一行是关于句子生成发生在人P身上,第二行是关于句子分析发生在人Q身上。函数
代表语音传输,应该是恒等函数。函数f'、g'和h'应该是计算从思想到口语表达的连续表示的函数f、g和h的反函数。但是,每个函数都可能是非单射的(通常是这样),因此在每个级别引入歧义,使得Q难以将其倒置以从接收到的声音序列中检索出原始含义(我故意使用“声音”一词来避免涉及细节)。对于书面交流,相同的图表适用,但细节有所不同。
我们忽略f和f',因为它们涉及语义,可能没有形式化,而我也没有能力处理。语法树经常由语法形式主义定义(在这里,我跳过了重要的细节,如特征结构,但它们可以考虑在内)。
函数g和函数h通常都不是单射的,因此会产生歧义。实际上,由于语音链中固有的各种错误,还有其他来源的歧义,但为简单起见,我们将忽略它,因为它并没有太大改变问题的本质。由于句子生成或传输,或者说话者和听者之间的语言规范不匹配,存在错误也是一个额外的歧义来源,因为听者试图在不知道可能存在的错误或是否存在的情况下纠正潜在的错误。
我们假设听者不会犯错,并且尽力根据自己的语言标准和知识,包括错误来源和统计数据,最好地“解码”句子。
词汇歧义
给定一个声音序列,听觉系统必须通过函数g'来反转词汇生成函数g的影响。第一个问题是几个不同的单词可能会产生相同的声音序列,这是第一个歧义的来源。第二个问题是听觉系统实际上接收到与一串单词对应的序列,可能没有表明单词开始或结束的指示。因此,可能有不同的方式将声音序列分割成对应于可识别单词的子序列。当噪声在单词之间造成更多混乱时,这个问题可能会恶化。
以下是一个例子,其中包含了一些
从网络中获取 的holorime 诗句,读起来差不多相似:
Ms Stephen, without a first-rate stakeholder sum or deal,
Must, even with outer fur straight, stay colder - some ordeal.
声音序列的分析可以通过一个有限状态非确定性自动机来完成,以动态规划模式进行解释,生成一个有向无环图,其中节点对应于单词分离,边缘对应于已识别的单词。通过图中的任何最长路径,可以将声音序列作为单词序列进行分析的可能方式。
上面的示例提供了(相当简单的)单词格子图(从左到右定向):
the-*-fun
/ \
Ms -*-- Stephen \ without --*-- a first -*- ...
/ \ / \ /
* * *
\ / \ / \
must --*-- even with -*- outer fur -*- ...
为了让声音序列也能对应以下单词序列(以及其他几个序列):
Ms Stephen, with outer first-rate ...
Must, even with outer first-rate ...
这使得词法分析变得模棱两可。可以使用概率选择最佳序列,但也可以保留所有可能的阅读歧义,并在下一阶段的句子分析中直接使用它。
请注意,“词格”可以被视为生成或识别单词序列所有可能的词汇读数的有限状态自动机。
句法歧义
句法结构通常基于无上下文文法骨架。无上下文语言的歧义问题是众所周知和分析过的。已经设计了许多通用的CF解析器来解析模糊的句子,并产生一个结构(稍有不同),从中可以提取出所有解析结果。这种结构被称为解析森林或共享解析森林。
已知的是,该结构在分析的句子长度最坏情况下可以是立方级别的,条件是语言语法被二元化,即每个规则右侧没有超过2个非终端符号(或更简单地说,每个规则右侧没有超过2个符号)。
实际上,所有这些一般的CF解析算法或多或少都是围绕一个简单的概念进行复杂变化的:有限状态自动机A的语言L(A)和CF文法G的语言L(G)的交集。这种交集的构建可以追溯到关于无上下文语言的早期论文(Bar-Hillel、Perles和Shamir 1961),旨在证明封闭性质。在1995年的一篇论文中,人们意识到它也是一种非常普遍的解析算法。
这个经典的叉积构造为两个语言L(A)和L(G)的交集提供了一个CF文法。如果你把一个句子w视为被解析的对象,并表示为词汇元素的序列,那么它也可以被看作是只生成句子w的有限状态自动机W。例如:
this is a finite state automaton
=> (1)------(2)----(3---(4)--------(5)-------(6)-----------((7))
有限状态自动机W只接受句子w=“this is a finite state automaton”。因此,L(W)={w}。
如果语言的文法是G,则交集构造会为语言L(G_w)=L(W)∩L(G)提供一个文法G_w。
如果句子w不在L(G)中,则L(G_w)为空,该句子无法识别。否则,L(G_w)={w}。此外,可以轻松证明,文法G_w以与文法G完全相同的解析树(因此具有相同的歧义性),仅需对非终结符进行简单重命名即可生成句子w。
文法G_w是w的(共享)解析森林,而w的解析树集合恰好是使用此文法的推导集合。因此,这提供了一种非常简单的视图来组织概念,并解释共享解析森林和一般CF解析器的结构。
但这还不止,因为它展示了如何推广到不同的语法和不同的结构进行解析。
通过交叉乘积构造对正则集的建设性闭包在许多语法形式中都很常见,这些语法形式将CF语法的能力扩展到了上下文敏感领域。这包括树相邻语法和线性无上下文重写系统。因此,这是一个关于如何为这些更强大的形式主义构建通用解析器的指南,这些解析器可以处理歧义并生成共享的解析森林,这些解析森林只是相同类型的专业化语法。
另一个泛化是,当存在词汇歧义时,词法分析会产生许多由单词网格共享表示的候选句子。然后,这个单词网格可以被读取为一个有限状态自动机,识别所有这些句子。然后,同样的交叉构造将消除所有不属于该语言(不符合语法)的句子,并产生一个CF语法,这是一个从单词网格中所有可接受的(符合语法的)句子的所有可能解析的共享解析森林。
如问题中所要求的,只要与可用的语言或话语信息兼容,所有可能的歧义读取都会被保留。
处理噪声和格式不正确的句子通常也使用有限状态设备进行建模,因此可以使用相同的技术来解决。
实际上还有许多其他问题需要考虑。例如,有许多构建共享森林的方法,共享程度更高或更低。用于预编译下推自动机以用于一般上下文无关分析的技术可能会影响共享的质量。过于聪明并不总是非常聪明。
请参见我在此主题上在SE上提供的其他答案: