Construire des relations de termes au sein d'un réseau
J'essaie de représenter les relations entre les nombres de la colonne A et leurs valeurs correspondantes dans B.
A B
Home [Kitchen, Home, Towel]
Donald [US, 02 , Donald, Trump]
Trump [Trump,Family, Cat, Dog]
Dog [Dog,Cat,Paws]
Les nombres de la colonne A et les nombres de B sont des nœuds dans un graphique. Je voudrais connecter des éléments de B à A ou entre eux. Par exemple:
- La maison en A est liée à elle-même; si je regarde dans la colonne B (la valeur n'apparaît que dans la première ligne), Home in B est connecté à Kitchen and Towel (lien entrant);
- Donald est lié à lui-même en tant que Donald n'est qu'en B; cependant, Donald in B est également connecté avec US, 02 et Trump (lien entrant);
- Trump a un lien sortant avec Donald et des liens entrants (famille, chat et chien);
- Le chien a un lien sortant avec Trump et des liens entrants (Cat and Paws).
La règle devrait alors être la suivante:
- si un mot de A est dans une autre ligne de B, alors créez un lien sortant;
- pour chaque mot de B, créez un lien entrant vers le mot de A, si le mot de A est également inclus dans B.
Comment dois-je ajuster mon code?
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()
Réponses
2 AzimMazinani
En convertissant votre table en pandas dataframe
, puis en parcourant ses lignes, vous pouvez ajouter les arêtes correspondantes comme ceci:
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')
Ce qui m'a donné le graphique suivant:
J'espère que c'est ce que vous vouliez!