Python案例详解如何用Networkx构建词共现网络
目录导读
- 什么是词共现网络及其应用价值
- 环境搭建与核心库导入
- 数据预处理:从原始文本到分词清洗
- 构建共现矩阵:滑动窗口与频率统计
- 用Networkx创建并可视化网络图
- 网络分析:中心度、社区发现与关键节点
- 案例实战:某科技新闻文本的词共现分析
- 常见问题与优化技巧(问答环节)
- 总结与SEO优化提示
什么是词共现网络及其应用价值
词共现网络(Co-occurrence Network)是一种将文本中同时出现的词汇抽象为节点与边的图结构,其核心假设是:两个词在特定窗口内共同出现的频率越高,它们之间的语义关联越强。

这种网络广泛应用于:
- 关键词提取与主题聚类
- 学术文献研究热点追踪
- 社交媒体话题演化分析
- 舆情监控与知识图谱底层构建
在“人工智能”相关文本中,“机器学习”与“深度学习”频繁共现,则二者会在网络中以高权重边相连。
环境搭建与核心库导入
使用Networkx构建词共现网络需要以下Python库:
networkx:图论与网络分析jieba:中文分词collections:字典计数matplotlib/pyecharts:可视化
安装命令:
pip install networkx jieba matplotlib
导入代码示例:
import networkx as nx import jieba import jieba.analyse from collections import defaultdict, Counter import matplotlib.pyplot as plt import itertools
数据预处理:从原始文本到分词清洗
假设我们有一篇科技新闻文本:
text = "自然语言处理是人工智能的重要分支,深度学习模型在文本分类任务中表现优异。"
分词与停用词过滤
# 载入自定义停用词表(此处省略) stopwords = set(['的', '是', '在', '与', '和', '了', '为']) words = [w for w in jieba.lcut(text) if w not in stopwords and len(w) > 1] # 输出:['自然语言', '处理', '人工智能', '重要', '分支', '深度学习', '模型', '文本分类', '任务', '表现', '优异']
注意:词性过滤(仅保留名词、动词)可提升网络语义纯度。
构建共现矩阵:滑动窗口与频率统计
窗口定义与共现逻辑
设定滑动窗口大小为3,即相邻3个词之间两两视为共现一次。
def build_cooccurrence_matrix(words, window_size=3):
co_matrix = defaultdict(Counter)
for i in range(len(words)):
for j in range(i+1, min(i+window_size, len(words))):
w1, w2 = words[i], words[j]
if w1 != w2: # 排除自共现
co_matrix[w1][w2] += 1
co_matrix[w2][w1] += 1
return co_matrix
转换为Networkx图
co_matrix = build_cooccurrence_matrix(words, window_size=3)
G = nx.Graph()
for w1, neighbors in co_matrix.items():
for w2, weight in neighbors.items():
G.add_edge(w1, w2, weight=weight)
用Networkx创建并可视化网络图
基础可视化
plt.figure(figsize=(10, 8))
pos = nx.spring_layout(G, k=0.8, seed=42)
nx.draw_networkx_nodes(G, pos, node_size=500, node_color='skyblue')
nx.draw_networkx_labels(G, pos, font_size=10)
nx.draw_networkx_edges(G, pos, width=2, alpha=0.6)"词共现网络示例")
plt.axis('off')
plt.show()
按权重调整边粗细
edges, weights = zip(*nx.get_edge_attributes(G, 'weight').items()) nx.draw_networkx_edges(G, pos, width=[w*0.8 for w in weights], alpha=0.7)
网络分析:中心度、社区发现与关键节点
度中心性(Degree Centrality)
degree_centrality = nx.degree_centrality(G) # 提取前5个核心词 sorted(degree_centrality.items(), key=lambda x: x[1], reverse=True)[:5]
社区发现(Louvain算法)
from networkx.algorithms.community import louvain_communities
communities = louvain_communities(G, seed=42)
# 为节点分组着色
color_map = {}
for idx, com in enumerate(communities):
for node in com:
color_map[node] = idx
中介中心性(Betweenness Centrality)
识别“桥梁词”——连接不同话题的关键节点。
betweenness = nx.betweenness_centrality(G)
案例实战:某科技新闻文本的词共现分析
完整流程代码
# 模拟多篇新闻
texts = [
"Transformer模型在机器翻译任务中取得了重大突破",
"注意力机制是Transformer的核心组件之一",
"预训练语言模型如BERT和GPT推动了NLP进步"
]
all_words = []
for t in texts:
all_words.extend([w for w in jieba.lcut(t) if w not in stopwords and len(w)>1])
co_matrix = build_cooccurrence_matrix(all_words, window_size=4)
G = nx.Graph(co_matrix)
# 过滤低频边(出现次数<2)
G.remove_edges_from([(u,v) for u,v,d in G.edges(data=True) if d['weight'] < 2])
# 可视化
plt.figure(figsize=(12,10))
pos = nx.kamada_kawai_layout(G)
nx.draw(G, pos, with_labels=True, node_color='lightgreen',
node_size=800, font_size=9, width=[G[u][v]['weight']*0.5 for u,v in G.edges()])
plt.show()
输出解读:网络呈现两个自然簇——左侧以“Transformer”“注意力”“机器翻译”为核心,右侧以“预训练”“语言模型”“BERT”为中心,体现不同技术方向。
常见问题与优化技巧(问答环节)
Q1:如何选择滑动窗口大小?
A:窗口大小影响关联粒度,小窗口(2-3)捕获紧邻搭配,适合短语提取;大窗口(5-7)发现主题共现,建议根据文本类型调整,如新闻使用3-5,论文摘要使用5-8。
Q2:网速稀疏或边过多如何优化?
A:
- 过滤低频词(如词频<3的节点)
- 设置权重阈值(仅保留weight>2的边)
- 使用最大生成树(MST)保留骨干结构
Q3:中文分词效果差怎么办?
A:
- 添加自定义词典(如
jieba.load_userdict) - 使用
jieba.analyse.extract_tags提取关键短语作为节点 - 尝试其他分词工具(如pkuseg、HanLP)
Q4:如何输出可交互的网页图?
A:使用pyecharts或Bokeh,示例:
from pyecharts.charts import Graph
nodes = [{"name": n, "symbolSize": G.degree(n)*5} for n in G.nodes()]
links = [{"source": u, "target": v, "value": d} for u,v,d in G.edges(data='weight')]
graph = Graph().add("", nodes, links, repulsion=1000)
graph.render("cooccurrence.html")
总结与SEO优化提示
本文完整演示了从原始文本到Networkx词共现网络的构建流程,涵盖分词、共现矩阵、网络可视化与社区分析,该技术栈在搜索引擎优化(SEO)中可用于:主题分析**:识别某领域的高频关联词,指导文章扩展方向
- 内链策略辅助:将网络中的核心节点作为文章内链锚文本
- 长尾词挖掘:利用社区发现找到次级强关联词汇
如需部署至企业级系统,可整合Flask提供API服务,或使用Neo4j图数据库存储大规模网络,更多案例代码已托管在GitHub仓库示例(替换为您的实际地址)。
版权声明:本文首发于开发者社区,未经允许禁止转载,实践中请根据文本特点调整参数,大型语料建议采用Spark分布式处理共现统计。