Python 将networkx图形输入zss算法(树编辑距离)
我想计算两棵树之间的Zhang Shasha树编辑距离(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
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具有特定的节点顺序,这在上面的示例中是正确的,但取决于我们构建它的方式。在答案中添加了处理此步骤的编辑。