networkx案例
时间: 2025-01-02 12:37:45 浏览: 10
### NetworkX 示例代码和应用案例
#### 社会网络分析示例
为了展示 `NetworkX` 的强大功能,在社会网络分析领域,可以通过创建节点和边来表示个体及其关系。这不仅限于一般的社会联系,还可以扩展到特定情境下的关系研究,比如恋情关系。
```python
import networkx as nx
import matplotlib.pyplot as plt
# 创建无向图G
G = nx.Graph()
# 添加节点
people = ['Alice', 'Bob', 'Charlie']
for person in people:
G.add_node(person)
# 定义并添加边(即两人间的关系)
relationships = [('Alice', 'Bob'), ('Bob', 'Charlie')]
for relationship in relationships:
G.add_edge(*relationship, type='friendship')
# 绘制图形
pos = nx.spring_layout(G) # 节点位置计算
nx.draw_networkx_nodes(G, pos, node_size=700)
nx.draw_networkx_edges(G, pos, edgelist=G.edges(), edge_color='black')
nx.draw_networkx_labels(G, pos)
plt.title('Simple Social Network Example')
plt.show()
```
此段代码展示了如何利用 `NetworkX` 来模拟简单的社交网络,并通过 `matplotlib` 进行可视化呈现[^2]。
#### 复杂网络探索实例
对于更复杂的网络结构,如科研或商业环境中遇到的数据网络,`NetworkX` 同样能够提供有效的解决方案。下面的例子说明了如何加载外部数据集并对其中的网络特性进行初步探究:
```python
import pandas as pd
from collections import Counter
# 假设有一个CSV文件描述了一些实体间的交互行为
df_interactions = pd.read_csv('interactions.csv')
# 初始化一个新的有向图对象D
D = nx.DiGraph()
# 将DataFrame中的每一对互动加入到图中作为一条有方向性的连接
for index, row in df_interactions.iterrows():
D.add_weighted_edges_from([(row['source'], row['target'], row['weight'])])
# 计算度中心性指标
degree_centrality_scores = dict(nx.degree_centrality(D))
print(f"Degree Centrality Scores: {Counter(degree_centrality_scores).most_common(5)}")
# 可视化部分重要节点
important_nodes = set([node for (node, score) in degree_centrality_scores.items() if score >= 0.1])
subgraph = D.subgraph(list(important_nodes))
pos = nx.shell_layout(subgraph)
nx.draw(subgraph, pos, with_labels=True, arrows=False)
plt.show()
```
这段脚本首先读取了一个假设存在的 CSV 文件,该文件记录了一系列源目标对以及相应的权重值;接着基于这些信息构建了一张加权有向图,并进行了基本统计分析——这里选择了度中心性得分最高的前五个节点来进行重点观察[^1]。
#### 知识图谱构建范例
当涉及到自然语言处理任务时,结合 `spaCy` 和 `Matplotlib` 使用 `NetworkX` 更能发挥其潜力。例如,可以用来解析文档内的句子成分,进而形成概念之间的关联图表,也就是所谓的知识图谱。
```python
import spacy
nlp = spacy.load("en_core_web_sm")
def extract_relations(doc):
relations = []
for sent in doc.sents:
triples = [(ent.text, ent.label_, chunk.root.head.text)
for ent in sent.ents
for chunk in sent.noun_chunks
if ent not in chunk and ent.label_ != "DATE"]
relations.extend(triples)
return relations
text = """SpaCy is an open-source software library for advanced natural language processing,
written in the programming languages Python and Cython."""
doc = nlp(text)
relations = extract_relations(doc)
KG = nx.Graph()
for source, label, target in relations:
KG.add_node(source, attr="entity")
KG.add_node(target, attr="verb")
KG.add_edge(source, target, key=label)
options = {
'node_color': 'lightblue',
'edge_color': '#BB0000',
'width': 2,
'with_labels': True,
}
nx.draw(KG, **options)
plt.show()
```
在此例子中,先是对输入文本执行分词、命名实体识别等预处理操作,再从中抽取有意义的概念组合成三元组形式的知识单元,最后借助 `NetworkX` 实现了简单版的知识图谱绘制工作[^3].
阅读全文