AttributeError: 'NoneType' object has no attribute 'get' when using greedy_modularity_communities from NetworkX

AttributeError: 'NoneType' object has no attribute 'get' when using greedy_modularity_communities from NetworkX

当我在一个有 123212 个节点和 329512 个边的网络上尝试 运行 来自 NetworkX 的 greedy_modularity_communities 社区发现算法时,我不断收到上述错误。

simpledatasetNX 这里是一个 NetworkX Graph 对象。这是我最近的 运行:

greedy_modularity_communities(simpledatasetNX)

以及输出的内容:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-a3b0c8705138> in <module>()
----> 1 greedy_modularity_communities(simpledatasetNX)

2 frames
/usr/local/lib/python3.7/dist-packages/networkx/algorithms/community/modularity_max.py in greedy_modularity_communities(G, weight, resolution)
 98             if j != i
 99         }
--> 100         for i in range(N)
101     }
102     dq_heap = [

/usr/local/lib/python3.7/dist-packages/networkx/algorithms/community/modularity_max.py in <dictcomp>(.0)
 98             if j != i
 99         }
--> 100         for i in range(N)
101     }
102     dq_heap = [

/usr/local/lib/python3.7/dist-packages/networkx/algorithms/community/modularity_max.py in <dictcomp>(.0)
 96             - 2 * resolution * k[i] * k[j] * q0 * q0
 97             for j in [node_for_label[u] for u in G.neighbors(label_for_node[i])]
---> 98             if j != i
 99         }
100         for i in range(N)

AttributeError: 'NoneType' object has no attribute 'get'

在多次尝试补救之后,我已经 运行 多次陷入这个确切的错误。这是我开始的地方,以及我为修复它所做的事情:

  1. 首先,我构建了一个 NetworkX MultiDiGraph object from a data set, and I needed to turn this into a Graph 对象以 运行 这个算法。我看着简单地做

desired_graph_object = nx.Graph(multidigraphobject)

它似乎在我制作的一个更简单的测试图上做了我想要它做的事情,所以我做了这个然后尝试 运行 算法,得到上面的错误。

  1. 我对问题可能是什么感到困惑。然后我想起我构建多图对象的方式涉及很多边的属性(这个原始对象上有接近 500,000 条边)所以当我试图将它简化为图对象时,可能会发生一些奇怪的事情相同的两个节点之间的多条边被组合在一起,因为我没有做任何事情来解释这一点。例如,其中一些属性是整数,一些是字符串。这似乎是一个足够简单的修复:我所要做的就是从我的数据集中构建一个新的图形对象,并只保留一个属性用于与 greedy_modularity_communities 算法相关的分析。所以我这样做了,结果却出现了完全相同的错误。

我现在怀疑我构建这两个图的方式有问题,因为无论我 运行 算法是在简化的多图对象上还是在图对象上,错误的性质都是一样的.

这是我构建图形对象的代码;构建多重二合字母对象的代码基本上是复制粘贴并稍作调整来实现的,所以我觉得没有必要包含它。据我所知,这段代码构造的图对象和前面讨论的多重二合图对象看起来都是我想要的。

%%time

for index, row in df.iterrows(): # *Go through our dataframe row by row*
  if row["link_id"] != row["parent_id"]: # *Check that the current row is a response to someone else*
    link_id_df = link_id_dataframe_dict[row["link_id"]] # *Get the desired thread's dataframe*
    for index2, row2 in link_id_df.iterrows(): # *Iterate through the thread dataframe's rows (comments)*
      if (row2["id"] in row["parent_id"]) and ( (row["author"],row2["author"]) not in nx.edges(G) ): # *Go until we find the comment whose id matches our original comment's parent_id, AND check that our current potential edge isn't already an edge*
        G.add_edge(row["author"],row2["author"]) # *Add the desired edge.*
        if row["subreddit"] == ("Daddit" or "daddit"): # *This line and the next three, add the necessary edge attributes.*
          nx.set_edge_attributes(G,{(row["author"],row2["author"]): {"daddit": 1, "mommit": 0}})
        else:
          nx.set_edge_attributes(G,{(row["author"],row2["author"]): {"daddit": 0, "mommit": 1}})
      elif (row2["id"] in row["parent_id"]) and ( (row["author"],row2["author"]) in nx.edges(G) ): # *If the edge already exists, ie these two users have interacted before, increase appropriate comment quantity*
        if row["subreddit"] == ("Daddit" or "daddit"):
          G[row["author"]][row2["author"]]["daddit"] += 1
        else:
          G[row["author"]][row2["author"]]["mommit"] += 1

一些额外的上下文:我的原始数据集是一个庞大的数据框,我想从中构建我的网络。每行代表社交媒体网站上的一条评论或 post。它涉及将 id 的评论链接到回复第一条评论的 parent_id 的评论。 link_id_dataframe_dict 是一个字典,其中键是给定的线程,与该键关联的对象是该线程中所有评论的子数据框(即 link_id)。

我们的想法是逐行遍历整个数据框,识别出 row/comment 所属的 thread/link_id,然后搜索关联的 link_id 数据另一个 row/comment 的框架,我们正在考虑的 row/comment 是对它的回应。当我们这样做时,我们在两个节点之间添加一条边,这条边代表评论,这两个节点是 post 回复的用户和被回复的评论。我们还通过添加标有该社区的属性 1 和其他社区的零来记录此评论回复发生在哪个社区,以跟踪这些用户在何处进行交互。对于此版本的代码,如果这些用户之前进行过交互,我们也会通过向表示新交互发生的社区的属性添加一个来记录这一点。

更新:

我从图中删除了自循环,但不幸的是 运行 仍然出现同样的错误。

您似乎遇到了一个已知错误,该错误已得到纠正。更多详情在这里:

https://github.com/networkx/networkx/pull/4996

我认为它还没有出现在最新发布的 networkx 版本中(看起来它会出现在 2.7 版中),但是如果你用这里的代码替换你正在使用的算法:https://github.com/networkx/networkx/blob/main/networkx/algorithms/community/modularity_max.py 它应该可以解决这个问题。

将 networkx 从 2.6.2 更新到 2.6.3 为我解决了这个问题。