Python案例如何用Networkx做词共现网络

wen python案例 2

Python案例详解如何用Networkx构建词共现网络

目录导读

  • 什么是词共现网络及其应用价值
  • 环境搭建与核心库导入
  • 数据预处理:从原始文本到分词清洗
  • 构建共现矩阵:滑动窗口与频率统计
  • 用Networkx创建并可视化网络图
  • 网络分析:中心度、社区发现与关键节点
  • 案例实战:某科技新闻文本的词共现分析
  • 常见问题与优化技巧(问答环节)
  • 总结与SEO优化提示

什么是词共现网络及其应用价值

词共现网络(Co-occurrence Network)是一种将文本中同时出现的词汇抽象为节点与边的图结构,其核心假设是:两个词在特定窗口内共同出现的频率越高,它们之间的语义关联越强

Python案例如何用Networkx做词共现网络

这种网络广泛应用于:

  • 关键词提取与主题聚类
  • 学术文献研究热点追踪
  • 社交媒体话题演化分析
  • 舆情监控与知识图谱底层构建

在“人工智能”相关文本中,“机器学习”与“深度学习”频繁共现,则二者会在网络中以高权重边相连。


环境搭建与核心库导入

使用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:使用pyechartsBokeh,示例:

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分布式处理共现统计。

抱歉,评论功能暂时关闭!