导入
题目描述
学习如何完成社交网络的知识图谱。
1import networkx as nx 2import matplotlib.pyplot as plt 3 4# 创建一个包含 500 个节点、平均度为 4、重连概率为 0.5 的合成图 5G = nx.watts_strogatz_graph(n=500, k=4, p=0.5, seed=42) 6 7# 使用 matplotlib 可视化图 8nx.draw(G, with_labels=False, node_size=50, width=0.5)
1from faker import Faker 2 3faker = Faker() 4Faker.seed(0) 5# 用于存储姓名的空列表 6node_names = [] 7 8# for 循环生成 500 个唯一姓名 9for i in range(501): 10 # 生成一个随机姓名 11 name = faker.name() 12 # 检查该姓名是否已在列表中 13 if name not in node_names: 14 # 如果不在,添加到列表中 15 node_names.append(name) 16 17# 打印列表中的前 10 个姓名 18print(node_names[0:10])
1import networkx as nx 2from faker import Faker 3import random 4import pandas as pd 5random.seed(2023) 6 7# 创建一个包含 500 个节点、平均度为 4、重连概率为 0.5 的合成图 8G = nx.watts_strogatz_graph(n=500, k=4, p=0.5, seed=42) 9 10# 节点名称 11faker = Faker() 12Faker.seed(0) 13node_names = [] 14# for 循环生成 500 个唯一姓名 15for i in range(501): 16 name = faker.name() 17 if name not in node_names: 18 node_names.append(name) 19 20# 重命名图 G 的节点名称 21mapping = {i: node_names[i] for i in range(len(node_names))} 22G = nx.relabel_nodes(G, mapping) 23 24# 移除可能存在的自环 25G.remove_edges_from(nx.selfloop_edges(G)) 26 27# 边属性名称 28attributes = ['friend', 'family', 'acquaintance', 29 'colleague', 'classmate', 'neighbor', 30 'schoolmate'] 31 32# 每个属性的概率分布 33prob_dist = {'friend': 0.3, 'family': 0.1, 'acquaintance': 0.2, 34 'colleague': 0.1, 'classmate': 0.1, 'neighbor': 0.1, 35 'schoolmate': 0.1} 36 37# 分配边属性 38for edge in G.edges: 39 G[edge[0]][edge[1]]['relation'] = random.choices(attributes,weights = list(prob_dist.values()),k=1)[0] 40 41# 将图转换为三元组数据框 42triples = [] 43for edge in G.edges: 44 triples.append([edge[0], G[edge[0]][edge[1]]['relation'], edge[1]]) 45 46# 创建数据框 47df = pd.DataFrame(triples) 48df.columns = ['h', 'r', 't'] 49 50print(df.sample(10))
数据框中的计数
| Relation | Count |
|---|---|
| friend | 302 |
| acquaintance | 179 |
| classmate | 109 |
| schoolmate | 106 |
| neighbor | 105 |
| colleague | 104 |
| family | 95 |
Note: 构建图本身是知识图谱分析中的一个关键环节。