You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建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}")

额外优化说明

  1. 改用df.iterrows()遍历每一行,无需提前提取唯一Cite Me As值,避免遗漏数据且逻辑更简洁
  2. 添加strip()清洗节点字符串,避免因首尾空格导致节点重复(如"Paper X"和" Paper X"被误判为两个节点)
  3. 计算介数中心性时指定directed=True,适配引文网络的有向特性
  4. 实现了通用的爆发性计算公式(爆发性通常定义为(度的标准差 - 度的均值) / (度的标准差 + 度的均值)),你可根据需求调整公式

内容的提问来源于stack exchange,提问作者Mehdi hemmati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:12:20