Как нарисовать граф?

У меня есть слово и его зависимые

modifiers = Counter()
for tree in b:
d = DependencyGraph(tree)
d.root = d.nodes[0] 
triples = list(d.triples())

for e1, rel, e2 in triples:
    if e1[0] == 'смотреть' and rel == 'obj':
        modifiers[e2[0]] += 1

  av = dict(modifiers)
 {'жалости': 1, 'подолгу': 1, 'детьми': 1, 'трагически': 2, 'лицо': 1, 'удовольствие': 1, 'возможность': 1, 'его': 1, 'действие': 1, 'гадко': 1}

Также у меня есть зависимые зависимых слов

Например, для слова ничего

modifiers2 = Counter()
for tree in b:
d = DependencyGraph(tree)
d.root = d.nodes[0] 
triples = list(d.triples())

for e1, rel, e2 in triples:
    if e1[0] == 'ничего' and rel == 'amod':
        modifiers2[e2[0]] += 1

Теперь мне нужно нарисовать граф, но я не знаю как Можете, пожалуйста, помочь

Вот такой граф, где вверху будет слово смотреть, потом его зависимые, напрмиер трагийчески и т.д


Ответы (2 шт):

Автор решения: MaxU

Для того, чтобы нарисовать граф методами модуля NetworkX, сначала необходимо создать граф. Это можно сделать разными способами, например задав список ребер или матрицу смежности.

Пример со списком ребер и словарем с весами вершин:

import networkx as nx
import matplotlib.pyplot as plt

data = [
  ["смотреть", "подолгу"], ["смотреть", "детьми"], 
  ["подолгу", "спать"], ["подолгу", "сидеть"], 
  ["спать", "сладко"], ["спать", "крепко"], 
  ["детьми", "воспитывать"], ["детьми", "ухаживать"]
]
weights = {
  'смотреть':2, 'подолгу':1.5, 'детьми':1.5, 'спать':1, 'сидеть':1, 'сладко':1, 
  'крепко':1, 'воспитывать':1, 'ухаживать':1
}
attrs = {key:{"weight": val} for key,val in weights.items()}

G = nx.Graph()
G.add_edges_from(data)
nx.set_node_attributes(G, attrs)
node_size = [a["weight"]*600 for n,a in G.nodes(data=True)]
fig, ax = plt.subplots(figsize=(10,10))
nx.draw(G, with_labels=True, node_size=node_size, ax=ax)


plt.show()

введите сюда описание изображения

→ Ссылка
Автор решения: Сергей П.

есть очень мощный метод через библиотеку pyvis. Слышу что плохо отображается в ноутбуках, но это неправда, надо просто указать notebook = True

#создаем данные 
from nltk.corpus import stopwords
stop_words = stopwords.words('russian')
data = CountVectorizer(ngram_range=(1, 3), 
                        token_pattern=r'\b\w+\b', 
                        min_df=1, 
                        stop_words= list(stop_words)
                       ).fit(df_ready['Text_lem'])
matrix = data.transform(df_ready['Text_lem']) 
import scipy.sparse
df = pd.concat([df,pd.DataFrame.sparse.from_spmatrix(matrix, columns=data.get_feature_names_out()),],axis = 1)
''' cols_to_drop = df.filter(like='gram').columns
df_ready = df.drop(cols_to_drop, axis=1)
cols_to_drop = df.filter(like='words').columns
df = df.drop(cols_to_drop, axis=1)
df'''
#удаляем ненужное
w_count = df.drop(columns=['Text',...).sum().sort_values()
words_to_del = w_count[w_count < 30].index
df = df.drop(columns= words_to_del)
test1 = df.drop(columns = ['Text', 'Text_lem', 'Text_toc_lem'], axis = 1)
#сам график
to_vis = {}
for index in test.index:
    temp = test.loc[[index]].T.sort_values(by=index, ascending=False)[:30].to_dict()
    to_vis.update(temp)
from pyvis.network import Network
g = Network(height='1000px', width='100%', notebook=True)
for cat, key_words in to_vis.items():
    g.add_node(cat, size = 9, color = 'blue')
    for word in key_words:
        g.add_node(word, size = 3)
        g.add_edge(cat, word)
g.show('text.html')
→ Ссылка