Costruire relazioni di termini all'interno di una rete
Aug 17 2020
Sto cercando di rappresentare le relazioni tra i numeri nella colonna A e i loro valori corrispondenti in B.
A B
Home [Kitchen, Home, Towel]
Donald [US, 02 , Donald, Trump]
Trump [Trump,Family, Cat, Dog]
Dog [Dog,Cat,Paws]
I numeri nella colonna A e i numeri in B sono nodi in un grafico. Vorrei collegare gli elementi in B ad A o tra loro. Per esempio:
- La casa in A è collegata a se stessa; se guardo nella colonna B (il valore compare solo nella prima riga), Home in B è collegata a Kitchen and Towel (link in entrata);
- Paperino è collegato a se stesso in quanto Paperino è solo in B; comunque, Donald in B è collegato anche con US, 02 e Trump (collegamento in entrata);
- Trump ha un collegamento in uscita con Donald e collegamenti in entrata (Famiglia, Gatto e Cane);
- Il cane ha un collegamento in uscita con Trump e collegamenti in entrata (Cat and Paws).
La regola dovrebbe essere la seguente quindi:
- se una parola in A è in un'altra riga in B, crea un collegamento in uscita;
- per ogni parola in B creare un collegamento in entrata alla parola in A, se la parola in A è inclusa anche in B.
Come devo modificare il mio codice?
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()
Risposte
2 AzimMazinani Aug 17 2020 at 16:26
Convertendo la tua tabella in un panda dataframe
e poi scorrendo le sue righe puoi aggiungere i bordi corrispondenti in questo modo:
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')
Che mi ha dato il seguente grafico:

Spero che questo sia quello che volevi!