目标
创建一个简单程序,将文件转化为一个节点和连接的集合,节点是所有参与者,连接是参与者之间的电子邮件列表,关联着权重,代表参与者之间的通信次数
代码
import csv
nodemap={}
linkmap={}
def addNode(key,kbytes):#定义节点函数
if key in nodemap:
node=nodemap[key]
node["count"]+=1
node["size"]+=kbytes
else:
node={"id":key,"count":1,"size":kbytes}
nodemap[key]=node
return
def addLink(src,tgt,kbytes): #定义连线函数
key=src+"..."+tgt
if key in linkmap:
link=linkmap[key]
link["count"]+=1
link["size"]+=kbytes
else:
link={"src":src,"tgt":tgt,"count":1,"size":kbytes}
linkmap[key]=link
return
#打开文件,跳过第一排
with open("genericEmails.txt") as datafile:
datareader = csv.reader(datafile, delimiter="\t")
next(datareader, None)
for row in datareader:
kb=int(row[4].replace("kb",""))#将kb移除,并转换字符串为整数
distlist=[];#创建所有人的姓名分发列表
for i in range(0,3):#从from--to--cc遍历
names=row[i].replace('"','').split(';')#用分号来拆分字段
for name in names:
name=name.strip()#移除无关空格
if(name!=""):#添加名字到分发列表
distlist.append(name)
for i in range(0,len(distlist)):#创建节点
addNode(distlist[i],kb)
#创建无向连接,如果创建有向连接、和创建节点类似
#由于一对人之间只有一个连接,可以按字母顺序定义连接避免重复
for i in range(0,len(distlist)):
for j in range(i+1,len(distlist)):
if(distlist[i]<distlist[j]):
source=distlist[i]
target=distlist[j]
else:
source=distlist[j]
target=distlist[i]
addLink(source,target,kb)
#写节点
with open("nodes.csv","w",newline="") as csvfile:
formatter=csv.writer(csvfile)
formatter.writerow(["Node","NumEmail","SumSize"])
for key in nodemap:
node=nodemap[key]
formatter.writerow([node["id"],node["count"],node["size"]])
#写连接
with open("links.csv","w",newline="") as csvfile:
formatter=csv.writer(csvfile)
formatter.writerow(["Source","Target","NumEmail","SumSize"])
for key in linkmap:
lk = linkmap[key]
formatter.writerow([lk["src"],lk["tgt"],lk["count"],lk["size"]])
遇到的问题
1.使用Gephi导入处理好的数据时,概览界面有图但是预览界面没有
如下
2.数据过多造成标签、节点遮盖的问题,对标签和节点调整了相对大小,还是存在遮盖问题
解决方法
1.暂时还没有解决
2.书上看到可以分层解决,同时还可以调整标签对其简化缩短,但是还没有试