介绍
CKY算法或维特比inside算法是成分句法分析的主要方法之一,但是当产生式数量特别大之后,时间复杂度也线性增大。可行的一种方法是剪枝,但是剪枝会造成准确率的下降。所以本文就提出了一种迭代的维特比句法分析算法,通过剪枝去除掉没用的边。实验表明,时间上加快了一个数量级,但是本文并没有说准确率怎么样。。。
本文用到的inside和outside算法之前已经介绍过了,详见PCFG中inside和outside算法详解。
算法框架
分层聚类
首先提出分层聚类的概念。
如上图所示,原来的类别标记有很多,将他们聚类成几个小类,再将这几个小类聚成更小的类,依次下去,最后类别标记会少很多很多。
以上图为例, ,聚类之后的分析表为b图,原始的分析表为a图,聚类之后的表(下面叫粗表)b唯一对应了聚类之前的表(下面叫原始表)a,而反过来原始表a能对应多种不同的粗表b。
形式化定义
我们将类别分为 层,分别表示为 ,那么第 m 层的类别集合 就是原始的类别集合,而 0 到 层的类别就称之为收缩符号。
对于 ,我们定义 ,其中 就是 的一个子集。该式将 中的一个类别 映射为了 中所有聚类为 的类别集合。
举个例子吧,在第一张图中, 。如果 ,那么 。
那么对于 ,我们定义产生式 的概率为:
也就是说,粗表中的每一棵句法树都给出了它在原始表中的句法树的分数的上界,通俗说就是,如果把粗表中的收缩符号全部替换成原始表中的符号,那么新的句法树的分数一定会小于等于粗表中的句法树。
引理
如果粗表中的最优句法树 不包含任意收缩符号,那么它等价于原始表中的最优句法树。
证明:
令 Y 等于原始表中的句法树集合, 等于没有出现在粗表中,但是出现在原始表中的句法树集合, 等于粗表中的句法树集合。
那么对于每一个句法树 ,都存在唯一的句法树 与之对应。所以可以推出:
这就意味着 也是原始表中的最优句法树。