네트워크 내에서 용어 관계 구축

Aug 17 2020

A 열의 숫자와 B의 해당 값 사이의 관계를 나타내려고합니다.

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

A 열의 숫자와 B의 숫자는 그래프의 노드입니다. B의 요소를 A 또는 서로 연결하고 싶습니다. 예를 들면 :

  • A의 집은 자신과 연결되어 있습니다. B 열을 살펴보면 (값이 첫 번째 행에만 표시됨) B의 Home은 Kitchen and Towel (ingoing 링크)에 연결됩니다.
  • Donald는 B에만 있기 때문에 Donald는 자신과 연결되어 있습니다. 그러나 Donald in B는 US, 02 및 Trump (ingoing link) 와도 연결되어 있습니다.
  • 트럼프는 도널드와 나가는 링크 및 나가는 링크 (가족, 고양이 및 개)가 있습니다.
  • 개는 트럼프와 나가는 링크 (Cat and Paws)를 가지고 있습니다.

규칙은 다음과 같아야합니다.

  • 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()

답변

2 AzimMazinani Aug 17 2020 at 16:26

테이블을 pandas로 변환 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', ['Trump','Family', 'Cat', 'Dog']],
        ['Dog', ['Dog', 'Cat' , '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')

다음 그래프를 얻었습니다.

이것이 당신이 원하는 것이기를 바랍니다!