Chu-LiuEdmonds算法之无环解析

Chu-Liu/Edmonds算法之无环解析

本篇博客是进一步介绍Chu-Liu/Edmonds算法是如何实施的。

前期介绍

该实验用的数据结构是python的嵌套字典,形如:

graph = {‘root’: {‘w0’: 3, ‘w1’: 4, ‘w2’: 3}, ‘w0’: {‘root’: 9, ‘w1’: 30, ‘w2’: 11}, ‘w1’: {‘root’: 10, ‘w0’: 20, ‘w2’: 0}, ‘w2’: {‘root’: 9, ‘w0’: 3, ‘w1’: 30}}

其中外层字典的key值是依存对中的依赖项,内层字典的key值是依存对中的核心词,内层字典的value值是依存对的权重,也就是依存对成立的可能性的大小。Chu-Liu/Edmonds算法要做的就是为除了根节点以为的其他词找到核心词。该篇博客只谈没循环的依存树,之后再讲有循环的如何解析。

具体步骤

1、如果有进入根的弧,则将其全部丢弃;

这个步骤比较好处理,只有将字典中:’root’: {‘w0’: 3, ‘w1’: 4, ‘w2’: 3}这个部分删掉,就不存在进入根节点的弧了。

如下图,将红色弧去掉:
Chu-LiuEdmonds算法之无环解析_第1张图片
2、对于除根以外的每个节点,选择权重最大的输入弧,让所选的n-1个弧成为集合s

这一步写了一个循环,逐个比较内层字典的value值,选出最大的并且记录当前的key值,赋值给一个新图。

代码如下:

new_graph = {}
for d0 in graph:
    tem = 0
    for d1 in graph[d0]:
        if graph[d0][d1] > tem:
            tem = graph[d0][d1]
            temp = d1
    new_graph[d0] = {}
    new_graph[d0][temp] = tem

形式化如下图:

处理前:

Chu-LiuEdmonds算法之无环解析_第2张图片

处理后:

Chu-LiuEdmonds算法之无环解析_第3张图片

你可能感兴趣的:(Chu-LiuEdmonds算法之无环解析)