Как нарисовать граф?
У меня есть слово и его зависимые
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')

