处理模糊性的算法或数据结构

8

我正在寻找用于处理歧义的算法或数据结构。

在我目前感兴趣的领域中,我正在研究自然语言的歧义解析,但我认为在计算机领域中必定有许多涉及歧义的应用。

我可以找到很多关于避免歧义的内容,但很少有关于如何应对歧义并分析歧义数据的内容。

假设一个解析器生成了这些替代的标记流或解释:

  • A B1 C
  • A B2 C
  • A B3 B4 C

可以看出流的某些部分在解释之间共享(A ... B),而其他部分则会分支成备选解释,并经常重新汇入主流。

当然,可能会有更多的解释、备选方案的嵌套和没有主流的解释。

显然,这是一种具有节点的图形。我不知道它是否有一个已经确定的名称。

是否存在既有的算法或数据结构可以处理这种歧义性图形,我可以进行学习研究吗?


1
我会将其描述为共享结构(例如,[SRFI 38](http://srfi.schemers.org/srfi-38/srfi-38.html))和记忆化。 - David Eisenstat
1
我发现在模糊解析中有一种结构叫做“SPPF”(共享压缩解析森林)。我找不到一个好的专门来源,并且我不确定它在处理除解析之外的领域中的歧义时是否有用。 - hippietrail
1
SPPF是由Elizabeth Scott在http://dinhe.net/~aredridel/.notmine/PDFs/SPPF-Style%20Parsing%20From%20Earley%20Recognizers.pdf中描述的。它们基本上与Marpa的bocages相同--我独立想出它们,但是在Scott之后。无论如何,她写得很好。 - Jeffrey Kegler
@JeffreyKegler:很有趣。根据我所能找到的阅读材料,我得出的印象是SPPF是由冈田大负责的GLR分析技术引入的。我看到了一些类似“冈田式SPPF”之类的短语。 - hippietrail
2
有一个 共享森林 的概念和一个 共享森林 的表达式。我不知道这个表达式是何时被首次使用,也不知道是谁使用的。至于这个概念,它至少和CYK算法(约1965年左右)一样古老,如果不更早的话,因为带有回溯指针的CYK算法确实构建了一个立方共享森林。然而,直到20世纪90年代初,它才被确定为一个语法。另一方面,GLR解析的原则可以追溯到1974年 - babou
显示剩余2条评论
3个回答

7

自然语言解析中的歧义和共享

一般情况下的歧义和共享

考虑到您的问题比较普遍,我尽量匹配这种普遍性。

当你考虑一个映射或函数 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_ww的(共享)解析森林,而w的解析树集合恰好是使用此文法的推导集合。因此,这提供了一种非常简单的视图来组织概念,并解释共享解析森林和一般CF解析器的结构。

但这还不止,因为它展示了如何推广到不同的语法和不同的结构进行解析。
通过交叉乘积构造对正则集的建设性闭包在许多语法形式中都很常见,这些语法形式将CF语法的能力扩展到了上下文敏感领域。这包括树相邻语法和线性无上下文重写系统。因此,这是一个关于如何为这些更强大的形式主义构建通用解析器的指南,这些解析器可以处理歧义并生成共享的解析森林,这些解析森林只是相同类型的专业化语法。
另一个泛化是,当存在词汇歧义时,词法分析会产生许多由单词网格共享表示的候选句子。然后,这个单词网格可以被读取为一个有限状态自动机,识别所有这些句子。然后,同样的交叉构造将消除所有不属于该语言(不符合语法)的句子,并产生一个CF语法,这是一个从单词网格中所有可接受的(符合语法的)句子的所有可能解析的共享解析森林。
如问题中所要求的,只要与可用的语言或话语信息兼容,所有可能的歧义读取都会被保留。

处理噪声和格式不正确的句子通常也使用有限状态设备进行建模,因此可以使用相同的技术来解决。

实际上还有许多其他问题需要考虑。例如,有许多构建共享森林的方法,共享程度更高或更低。用于预编译下推自动机以用于一般上下文无关分析的技术可能会影响共享的质量。过于聪明并不总是非常聪明。

请参见我在此主题上在SE上提供的其他答案:


2
我正在进行 使用 Marpa::R2 ASF 构建的 PFG(解析森林语法) 实验 -- Parse-Forest Grammars
这种方法是将歧义解析表示为语法,设计一个准则来修剪不需要的规则,应用它,然后从 PFG 中删除无生产力和无法访问的符号,从而得到一个解析树。
这个测试用例(This test case)是一个示例:它解析具有高度歧义的语法的算术表达式,然后基于结合性和优先级修剪PFG规则,清理语法,将其转换为抽象语法树(引用来源中的问题3.10 - Grune和Jacobs)。

我一直在查看Marpa文档,但是我找不到一个明确讨论解析森林语法或者解析森林作为语法的地方。你有相关指引吗?我知道解析森林语法的一般概念,但我对它在Marpa中的应用更感兴趣。 - babou
1
在Marpa中不使用解析森林语法(PFGs)。Marpa::R2使用抽象语法森林(ASFs)来表示模糊解析。PFGs看起来很有用,可以同时处理多个解析,因此我使用ASFs构建PFGs,然后再处理PFGs。 - rns

1
我会称这种数据结构为格子,例如参见词汇化分析(PDF)。

是的,我已经经常遇到“词格”这个术语,主要与解析之前的阶段(如分词和形态分析)有关。 - hippietrail
名为lattice,或者更准确地说是word lattice,指的是用于表示词汇歧义的共享结构(简单地将句子划分为词汇单位),而不是一般的句法歧义。在句子组织的树状结构层面上,正确表示句法歧义的方法是使用一种语法,该语法以不同的方式生成给定的句子(或者在词汇歧义的情况下,生成由lattice定义的所有句子)。CC @hippietrail - babou
@babou:在我深入研究晶格相关术语和概念时,我开始接触到另一个术语/概念,即混淆网络或者词混淆网络WCN)。但我还不太明白它们与晶格之间的区别。 - hippietrail
1
我正在回答您的原始问题。关于WCN,它似乎是单词格的一种变体,这似乎是相当新的。其目的是在由噪声引起的模糊情况下使用不同的优化标准来选择最佳答案。参考文献是Mangu、Brill、Stolke 2000: Finding consensus in speech recognition: word error minimization and other applications of confusion networks(实际上是一个具有不适当名称的pdf文件)。 - babou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接