在网络内建立术语关系

问题描述

我试图表示A列中的数字与B中对应值之间的关系。

A            B
Home     [Kitchen,Home,Towel]
Donald   [US,02,Donald,Trump]
Trump    [Trump,Family,Cat,Dog]
Dog      [Dog,Paws]

A列中的数字和B列中的数字是图中的节点。我想将B中的元素连接到A或彼此连接。例如:

  • A中的房屋与自身相连;如果我在B列中查找(该值仅出现在第一行中),则B中的Home连接到Kitchen and Towel(正在链接);
  • Donald与自己链接在一起,因为Donald仅在B中;但是,B中的唐纳德(Donald)也与美国,02和特朗普(持续链接)相关联;
  • 特朗普与唐纳德有往来链接,而往来链接有(家庭,猫和狗);
  • 狗与特朗普之间有往来链接,而往来链接(猫和爪子)也有联系。

那么规则应如下:

  • 如果A中的单词在B中的另一行中,则创建一个传出链接
  • 如果A中的单词也包含在B中,则为B中的每个单词创建一个到A中的单词的内向链接

我应该如何调整代码

file = file.assign(B=file.B.map(list)).explode('B')


G = nx.DiGraph()
nx.add_path(G,file['A'])
nx.add_path(G,file['B'])

nx.draw_networkx(G)
plt.show()

解决方法

将表格转换为熊猫dataframe,然后遍历其行,您可以添加相应的边,如下所示:

import networkx as nx
import pandas as pd
from pyvis.network import Network


df = pd.DataFrame(
    [
        ['Home',['Kitchen','Home','Towel']],['Donald',['US','02','Donald','Trump']],['Trump','Family','Cat','Dog']],['Dog','Paws']]
    ],columns=['A','B']
)

G = nx.DiGraph()

for i,j in enumerate(df['A']):
    for index,row in df.iterrows():
        if i != index:
            if j in row['B']:
                G.add_edge(row['A'],j)
        else:
            for n in row['B']:
                if j != n:
                    G.add_edge(j,n)

    if G.in_degree(j) == 0:
        G.add_edge(j,j)

N = Network(directed=True)  # using pyvis to show self loops as well

for n,attrs in G.nodes.data():
    N.add_node(n)

for e in G.edges.data():
    N.add_edge(e[0],e[1])

N.write_html('graph.html')

哪个给我下图:

enter image description here

希望这就是您想要的!