ネットワーク内で用語関係を構築する

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のホームはキッチンとタオルに接続されています(リンクを入力)。
  • ドナルドはBにのみ存在するため、ドナルドはそれ自体とリンクしています。ただし、BのドナルドはUS、02およびトランプ(ingoingリンク)とも接続されています。
  • トランプには、ドナルドとの発信リンクと着信リンク(ファミリー、キャット、ドッグ)があります。
  • 犬には、トランプとの発信リンクと着信リンク(猫と足)があります。

その場合、ルールは次のようになります。

  • 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

テーブルをパンダに変換して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')

それは私に次のグラフを与えました:

これがあなたが望んでいたものであることを願っています!