在python中使用igraph创建无向加权图

Gna*_*uha 2 python twitter graph igraph

我在文本文件中有一个数据,我想创建一个无向加权图,因为我从文件中读取它.数据包含推文.对于推文中的每个单词,我在图中创建一个节点.对于每个其他单词,我在它们之间创建一个边,并将它们的重量加1.所以边缘的权重应该是所有推文中两个单词的出现次数.

我创建了一个图表:

graph=igraph.Graph();
Run Code Online (Sandbox Code Playgroud)

我使用其ID在两个节点之间获得优势:

edge=graph.es.select(_source=id1,_target=id2);
Run Code Online (Sandbox Code Playgroud)

但是,即使图形是无向的,也不会找到从id2到id1的边缘.所以我使用了以下hack:

edge1=graph.es.select(_source=id1,_target=id2);
edge2=graph.es.select(_source=id2,_target=id1);

if (len(edge1)>len(edge2)):
   edge=edge1;
else:
   edge=edge2;
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是:有更好的方法吗?

但是我的主要问题是更新重量.在我使用上面的代码找到边缘后,我尝试使用以下方法更新它的重量:

if (len(edge)==0):
   graph.add_edge(id1,id2);
   edge=graph.es.select(_source=id1,_target=id2);
   edge["weight"]=1;
#else add weight
else:
    print edge.attributes();
    print edge["weight"];
    edge["weight"][0]=edge["weight"][0]+1;
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

 ...
 ['weight']
 [None]
 Traceback (most recent call last):
   File "/home/ivan/workspace/Twitter/process/MovieGraph.py", line 145, in <module>
     processTweet(g,words);
   File "/home/ivan/workspace/Twitter/process/MovieGraph.py", line 87, in processTweet
     edge["weight"][0]=edge["weight"][0]+1;
 TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
Run Code Online (Sandbox Code Playgroud)

我试图调试,但看起来边缘存在,但重量没有定义.这怎么可能?谢谢.

Tam*_*más 6

关于在顶点之间找到边缘id1id2:使用get_eid可能更快,因为它完全用C实现.你可以这样做:

eid = graph.get_eid(source, target)
edge = graph.es[eid]
Run Code Online (Sandbox Code Playgroud)

(第二行是必需的,因为只get_eid返回边的ID,而不是边缘本身).get_eid还可以正确处理无向图; 换句话说,对于无向图,它总是在两个方向上看.

但是,请注意,get_eid如果您要查找的边不存在则抛出异常,因此您还应该捕获异常并添加边:

try:
    eid = graph.get_eid(source, target)
except igraph.InternalError:
    eid = graph.ecount()
    graph.add_edge(source, target, weight=0)
Run Code Online (Sandbox Code Playgroud)

except分支利用了这样的事实:新添加的边缘的ID总是等于添加之前图形中的边缘数量,因为边缘总是从零开始连续编号.请注意,调用add_edge也将weight属性的值设置为零,因此您可以简单地增加try..except块后的权重,如下所示:

edge["weight"] += 1
Run Code Online (Sandbox Code Playgroud)