如何使用NetworkX读取空格分隔文本构建可分析的关系网络图
读取空格分隔作者合作边、构建NetworkX关系图的实现方案
核心逻辑说明
此前使用readline()读取得到的整行字符串,本质是未拆分的纯文本,只要通过字符串拆分方法将每一行解析为独立的两个作者节点,即可直接适配NetworkX的图构建逻辑,无需复杂的字符串处理。
基础读取实现(无权重合作图)
针对每一行存储一对作者合作关系的格式,采用逐行遍历+空白拆分的方式读取,代码可直接运行:
import networkx as nx import matplotlib.pyplot as plt # 初始化无向图(作者合作为双向对等关系,无需使用有向图结构) coauthor_graph = nx.Graph() # 打开目标文件逐行解析 with open("train.txt", "r", encoding="utf-8") as f: for raw_line in f: # 去除行首尾的换行符、多余空格,按任意空白字符拆分(兼容多空格、制表符分隔场景) line_parts = raw_line.strip().split() # 跳过空行、无效行 if len(line_parts) < 2: continue # 将拆分得到的两个作者ID作为边加入图 # NetworkX会自动对重复边去重,即使同一对作者的合作记录多次出现也不会产生冗余边 coauthor_graph.add_edge(line_parts[0], line_parts[1])
注意:拆分时使用无参数的
split()方法,比显式指定split(" ")的鲁棒性更强,可自动过滤连续空格、行内多余空白,避免生成空字符串的无效节点。
带权重的扩展读取实现
如果需要统计同一对作者的合作发文量(将重复出现的边作为边权重),可在读取时累加边的出现次数:
weighted_coauthor_graph = nx.Graph() with open("train.txt", "r", encoding="utf-8") as f: for raw_line in f: line_parts = raw_line.strip().split() if len(line_parts) <2: continue author_u, author_v = line_parts[0], line_parts[1] # 读取当前边的已有权重,首次出现则默认权重为0 exist_weight = weighted_coauthor_graph[author_u][author_v]["weight"] if weighted_coauthor_graph.has_edge(author_u, author_v) else 0 # 更新权重:每遇到一次合作记录就累加1 weighted_coauthor_graph.add_edge(author_u, author_v, weight=exist_weight +1)
读取结果验证与绘图
读取完成后可先校验数据规模是否符合预期,再执行可视化:
# 基础结果校验 print(f"共识别独立作者节点:{coauthor_graph.number_of_nodes()}") print(f"共识别有效合作关系:{coauthor_graph.number_of_edges()}") # 基础关系图绘制 nx.draw(coauthor_graph, with_labels=True, node_size=60, font_size=8) plt.show()
常见问题规避
- 不要直接将整行读取的字符串作为节点传入图结构,否则会将整行内容识别为单个孤立节点,无法构建真实的边连接关系。
- 若作者ID为数字格式,无需手动转成整数类型,NetworkX支持字符串格式的节点标识,强制转成整数反而可能和文件内的原始格式不匹配。
内容的提问来源于stack exchange,提问作者Kamalpreet singh
相关产品推荐
相关产品推荐

