Мой словарь auto_anno
выглядит следующим образом:
defaultdict(<class 'dict'>,
{'Beda': {'Fuery': {'anger': 2,
'anticipation': 1,
'disgust': 2,
'fear': 2,
'sadness': 2}},
'Fuery': {'Beda': {'surprise': 1},
'Fuery': {'anger': 1,
'anticipation': 6,
'disgust': 2,
'fear': 1,
'joy': 5,
'sadness': 2,
'surprise': 4,
'trust': 4},
'Hawkeye': {'anger': 1, 'fear': 3, 'trust': 1},...#etc
Моя цель состоит в том, чтобы автоматически создавать два файла csv с использованием таких словарей.Один CSV-файл для узлов (идентификаторы персонажа от 0 до x и его метка, или имя персонажа) и второй CSV-файл для их отношений в зависимости от эмоции и ее веса (здесь: ключи первого слова - это source
и ключи вложенного dict: target
.
До сих пор я придумал эту функцию, которая использует pickle
для загрузки словаря выше:
def automate_gephi():
"""CREATES TWO CSV FILES TO USE IN GEPHI"""
auto_anno = pickle.load(open("auto_anno.p", "rb"))
characters = set()
for char1,value in auto_anno.items(): # this is the predicted graph (a dictionary where each key is an experiencer and each value is a stimulus with emotions)
for char2,val in value.items():
characters.add(char1)
characters.add(char2)
file_node = open("nodes.csv", "w") #only nodes and id's go here
file_node.write("Id"+"\t"+"Label"+"\n")
# for each node create a numeric id and write to file
for n,name in enumerate(characters):
file_node.write(str(n)+"\t"+"%s" %name+"\n")
file_node.close()
# edges
read_nodes = open("nodes.csv","r")
edges_file = open("edges.csv","w")
sep = "\t"
edges_file.write("Source"+sep+"Target"+sep+"Label"+sep+"Weight"+"\n")
Adjacency = {}
for line in read_nodes:
try:
Adjacency[line.strip().split("\t")[1]] = line.strip().split("\t")[0]
except IndexError:
pass
continue
for key,value in auto_anno.items():
source = key
for k1,v1 in value.items():
target = k1
for emotion,weight in v1.items():
try:
edges_file.write(str(Adjacency[source])+sep+str\
(Adjacency[target])+sep+emotion+sep+\
" ".join([i for i in weight["Weight"]])+"\n")
except KeyError:
pass
edges_file.close()
НоЯ получаю это сообщение об ошибке:
line 224, in automate_gephi
" ".join([i for i in weight["Weight"]])+"\n")
TypeError: 'int' object is not subscriptable
Пример желаемого вывода:
ФАЙЛ 1: Узлы :
Id Label
0 Beda
1 Fuery
2 Hawkeye
ФАЙЛ 2: Края :
Source Target Label Weight
0 1 anger 2
0 1 anticipation 1
.
.
.#etc
Что мне здесь не хватает? Любая помощь приветствуется!
Заранее спасибо!