Python 将networkx图形输入zss算法(树编辑距离)

Python 将networkx图形输入zss算法(树编辑距离),python,graph,tree,distance,networkx,Python,Graph,Tree,Distance,Networkx,我想计算两棵树之间的Zhang Shasha树编辑距离(zsslibrary)。然而,我的树是以networkx图的形式出现的(它们实际上代表domhtml树)。zss中的示例显示了如何手动创建树: from zss import * A = ( Node("f") .addkid(Node("a") .addkid(Node("h")) .addkid(Node("c") .addkid(N

我想计算两棵树之间的Zhang Shasha树编辑距离(
zss
library)。然而,我的树是以
networkx
图的形式出现的(它们实际上代表domhtml树)。zss中的示例显示了如何手动创建树:

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
节点对象,然后计算两棵树之间的编辑距离

谢谢


(如果您认为这是一个XY问题,请毫不犹豫地告诉我)

使用
dfs\u 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\u树(G,source=list(G.nodes)[0])
,对吗?这将起作用,而且只需省略源参数并调用
nx.dfs\u树(G)
。但是,它假设G具有特定的节点顺序,这在上面的示例中是正确的,但取决于我们构建它的方式。在答案中添加了处理此步骤的编辑。