【问题标题】:input networkx graph into zss algorithm (tree edit distance)将networkx图输入zss算法(树编辑距离)
【发布时间】:2019-01-18 11:52:52
【问题描述】:

我想计算两棵树之间的 Zhang-Shasha 树编辑距离(zss library)。但是,我的树采用networkx 图形的形式(它们实际上代表 DOM html 树)。 zss documentation 中的示例展示了如何手动创建树:

from zss import *
A = (
    Node("f")
        .addkid(Node("a")
            .addkid(Node("h"))
            .addkid(Node("c")
                .addkid(Node("l"))))
        .addkid(Node("e"))
    )
zss.simple_distance(A, A) # [0.0]

这将是同一棵树:

import networkx as nx
G=nx.DiGraph()
G.add_edges_from([('f', 'a'), ('a', 'h'), ('a', 'c'), ('c', 'l'), ('f', 'e')])

所以我想将networkx类的树对象转换为zss Node对象,然后计算两棵树之间的编辑距离。

谢谢

(如果您认为这是 XY 问题,请随时告诉我)

【问题讨论】:

标签: python graph tree distance networkx


【解决方案1】:

使用dfs_tree 绝对有帮助:

import zss
import networkx as nx

G=nx.DiGraph()
G.add_edges_from([('f', 'a'), ('a', 'h'), ('a', 'c'), ('c', 'l'), ('f', 'e')])
T = nx.dfs_tree(G, source='f')
nodes_dict = {}
for edge in T.edges():
    if edge[0] not in nodes_dict:
        nodes_dict[edge[0]] = zss.Node(edge[0])
    if edge[1] not in nodes_dict:
        nodes_dict[edge[1]] = zss.Node(edge[1])
    nodes_dict[edge[0]].addkid(nodes_dict[edge[1]])

print(zss.simple_distance(nodes_dict['f'], nodes_dict['f'])) # 0.0

如果我们不知道哪个节点是 G 的根节点,但知道我们有一个有效的树,我们可以通过调用来获取源节点:

source = [n for (n, d) in G.in_degree() if d == 0][0]
T = nx.dfs_tree(G, source=source)

由于根是唯一没有传入节点的节点,所以应该可以。

【讨论】:

  • 谢谢,你提供了source 参数作为顶部节点,我猜?我将如何在函数中自动化它,我的意思是我可以将它初始化为T = nx.dfs_tree(G, source=list(G.nodes)[0]),对吗?
  • 这会起作用,也可以简单地省略源参数并调用nx.dfs_tree(G)。但是,它假设 G 具有特定的节点排序,这在上面的示例中是正确的,但取决于我们构建它的方式。在答案中添加了处理此步骤的编辑。
猜你喜欢
  • 2010-11-07
  • 2015-12-09
  • 2013-10-13
  • 1970-01-01
  • 2016-11-21
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多