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

标签 python twitter graph igraph

我在文本文件中有一个数据,我想在从文件中读取数据时创建一个无向加权图。数据由推文组成。对于推文中的每个词,我在图中创建了一个节点。对于每个其他单词,我在它们之间创建一条边,并将它们的权重加 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'

我尝试调试,但看起来边缘存在但未定义权重。这怎么可能?谢谢。

最佳答案

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

eid = graph.get_eid(source, target)
edge = graph.es[eid]

(需要第二行,因为 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)

except 分支利用了这样一个事实,即新添加的边的 ID 始终等于添加之前图中的边数,因为边总是从零开始连续编号。请注意,对 add_edge 的调用还将 weight 属性的值设置为零,因此您可以在 try..except 之后简单地增加权重> block 如下:

edge["weight"] += 1

关于python - 在 python 中使用 igraph 创建无向加权图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19479571/

相关文章:

python - 使用 imaplib 阅读电子邮件 - "Got more than 10000 bytes"错误

python - 如何将 ASCII 十六进制代码的路径转换为其等效的 ASCII 字母?

python - 广度优先搜索还是深度优先搜索?

java - 在 MongoDB 中保留多重图

python - 通过相同的键python将csv转换为json

python - 如何在Python中计算数值趋势线

python - 树分类器的极高准确度指标

python - networkx通过欧氏距离阈值构造图

c# - 如何使用 Twitter 验证用户但不用于登录目的

php - 从 twitter api 实体参数 php 获取图片 url