构建WoS引文网络时Betweenness Centrality全为0的代码问题排查
问题分析与代码修正
核心错误:循环缩进逻辑错误
你的代码中三个for循环是平级结构,这会导致:
- 第一个循环遍历所有
Cite Me As条目,但每次都会覆盖nodes_list,最终只保留最后一条Cite Me As对应的参考文献列表 - 后续两个循环仅处理最后一条
Cite Me As的参考文献,导致只构建了极少量的边和节点,网络结构完全异常,因此所有节点的介数中心性均为0
修正后的代码
import pandas as pd import networkx as nx # 读取指定列的数据 df = pd.read_csv("D:/dade.csv", usecols=["Cite Me As", "Cited References"]) # 移除包含空值的行 df = df.dropna() # 初始化有向图 G = nx.DiGraph() # 遍历每一行数据,完整构建引文网络 for _, row in df.iterrows(): source_node = row["Cite Me As"].strip() cited_refs_str = row["Cited References"] # 分割参考文献列表 target_nodes = [ref.strip() for ref in cited_refs_str.split("|")] # 逐个添加引用边,跳过空节点 for target in target_nodes: if source_node and target: G.add_edge(source_node, target) # 计算有向图的介数中心性 betweenness_centrality = nx.betweenness_centrality(G, directed=True) # 计算网络爆发性(NetworkX无内置函数,采用通用公式) degrees = [degree for _, degree in G.degree()] mean_deg = pd.Series(degrees).mean() std_deg = pd.Series(degrees).std() burstiness = (std_deg - mean_deg) / (std_deg + mean_deg) # 输出结果 print("介数中心性:") for node, bc_value in betweenness_centrality.items(): print(f"{node}: {bc_value:.4f}") print(f"\n网络爆发性:{burstiness:.4f}")
额外优化说明
- 改用
df.iterrows()遍历每一行,无需提前提取唯一Cite Me As值,避免遗漏数据且逻辑更简洁 - 添加
strip()清洗节点字符串,避免因首尾空格导致节点重复(如"Paper X"和" Paper X"被误判为两个节点) - 计算介数中心性时指定
directed=True,适配引文网络的有向特性 - 实现了通用的爆发性计算公式(爆发性通常定义为
(度的标准差 - 度的均值) / (度的标准差 + 度的均值)),你可根据需求调整公式
内容的提问来源于stack exchange,提问作者Mehdi hemmati
相关产品推荐
相关产品推荐

