如何在Python中通过稀疏矩阵乘法创建2个one-mode network
二部稀疏矩阵生成单模网络实现方案
你当前输出的是标题-标签二部邻接矩阵的可视化结果,通过矩阵乘法生成两类单模网络的实现方法如下:
核心原理
两类单模网络的构造逻辑:
- 标题共现网络:两个标题的连边权重等于二者共享的标签数量,通过
二部矩阵 × 二部矩阵转置计算得到 - 标签共现网络:两个标签的连边权重等于二者共同出现的标题数量,通过
二部矩阵转置 × 二部矩阵计算得到
完整实现代码
依赖scipy处理稀疏矩阵,避免密集矩阵带来的内存浪费:
import scipy.sparse as sp import numpy as np # 你的原始数据 data = [ {"title": "title1", "tags": ["tag1", "tag2", "tag3"]}, {"title": "title2", "tags": ["tag1"]}, ] tags = sorted({t for d in data for t in d["tags"]}) title_list = [d["title"] for d in data] # 构造csr格式稀疏二部邻接矩阵,行对应标题,列对应标签 rows = [] cols = [] values = [] for row_idx, item in enumerate(data): for tag in item["tags"]: col_idx = tags.index(tag) rows.append(row_idx) cols.append(col_idx) values.append(1) bi_adj = sp.csr_matrix((values, (rows, cols)), shape=(len(title_list), len(tags))) # 生成标题单模网络邻接矩阵 title_adj = bi_adj @ bi_adj.T # 可选:将对角元素(自身标签总数)置为0,忽略自环 np.fill_diagonal(title_adj.data, 0) # 生成标签单模网络邻接矩阵 tag_adj = bi_adj.T @ bi_adj # 可选:置零对角元素,忽略自环 np.fill_diagonal(tag_adj.data, 0) # 打印结果验证 print("标题共现网络邻接矩阵:") print(f"{'':<10}" + "".join(f"{t:<10}" for t in title_list)) for idx, row in enumerate(title_adj.toarray()): print(f"{title_list[idx]:<10}" + "".join(f"{v:<10}" for v in row)) print("\n标签共现网络邻接矩阵:") print(f"{'':<10}" + "".join(f"{t:<10}" for t in tags)) for idx, row in enumerate(tag_adj.toarray()): print(f"{tags[idx]:<10}" + "".join(f"{v:<10}" for v in row))
输出示例解释
以你的测试数据为例,输出结果符合预期:
- 标题共现矩阵中title1和title2的交叉值为1,代表两个标题共享1个标签
- 标签共现矩阵中tag1和tag2、tag1和tag3的交叉值为1,代表这些标签对共同出现在1个标题中
内容的提问来源于stack exchange,提问作者user12217822
相关产品推荐
相关产品推荐

