[英]Creating undirected weighted graph with igraph in python
我在文本文件中有一个数据,我想在从文件中读取数据时创建一个无向加权图。 数据由推文组成。 对于推文中的每个单词,我都会在图中创建一个节点。 对于每个其他单词,我在它们之间创建一条边,并为其权重加1。 因此,边缘的权重应该是所有推文中两个单词出现的次数。
我创建一个图:
graph=igraph.Graph();
我通过使用ID在两个节点之间获得优势:
edge=graph.es.select(_source=id1,_target=id2);
但是,即使图形是无向的,也无法找到从id2到id1的边。 因此,我使用了以下技巧:
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;
我的第一个问题:有更好的方法吗?
但是我的主要问题是更新权重。 在使用上述代码找到边缘后,我尝试使用以下方法更新其权重:
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;
但是我收到以下错误:
...
['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'
我尝试调试,但看起来边缘存在但未定义权重。 这怎么可能? 谢谢。
关于在顶点id1
和id2
之间找到一条边:使用get_eid
可能更快,因为它完全在C中实现。您可以执行以下操作:
eid = graph.get_eid(source, target)
edge = graph.es[eid]
(需要第二行,因为get_eid
返回边缘的ID, get_eid
返回边缘本身)。 get_eid
还可以正确处理无向图。 换句话说,对于无向图,它将始终在两个方向上查找。
但是,请注意,如果要查找的边线不存在, get_eid
会引发异常,因此,您还应该捕获该异常并添加边线:
try:
eid = graph.get_eid(source, target)
except igraph.InternalError:
eid = graph.ecount()
graph.add_edge(source, target, weight=0)
except
分支利用了这样一个事实,即新添加的边的ID将始终等于加法之前图中的边的数目,因为边总是从0开始连续编号。 请注意,对add_edge
的调用还将weight
属性的值设置为零,因此您可以在try..except
块之后简单地增加权重,如下所示:
edge["weight"] += 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.