语义网络图谱:把 10 万条评论变成”一张可缩放的关系地图”

上次讲了共现矩阵 + 网络关系图(共现网络图软件),老板们实操时提了新需求:

这些需求,就是语义网络图谱要解决的。

一、共现网络 vs 语义网络:区别在哪?

维度 共现网络图(P06) 语义网络图谱(P14)
节点 Top 200 高频词 Top N 词(可配,100-1000)
共现频次 共现频次 + 中心度加权
布局 力导向(简单) 力导向 + 社区检测 + 子图提取
分析 看谁和谁连 看中心节点 + 社区结构 + 关键子图
输出 1 张图 多张图 + 节点 CSV + 边 CSV + 中心度表
适用 快速看关系 深度研究、论文、报告

简单说:共现网络图是”看一眼”;语义网络图谱是”看门道”

二、3 步把 10 万条评论变成关系地图

Step 1:共现矩阵(同共现网络图)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import jieba
import pandas as pd
from collections import defaultdict
from itertools import combinations

# 读 10 万条评论
df = pd.read_csv('comments.csv') # 一列:content
texts = df['content'].dropna().tolist()

# 分词 + 去停用词
stopwords = set(open('cn_stopwords.txt', encoding='utf-8').read().split())
def tokenize(text):
return [w for w in jieba.lcut(text) if len(w) > 1 and w not in stopwords]

tokenized = [tokenize(t) for t in texts]

# 滑窗共现(窗口=5)
WINDOW = 5
cooccur = defaultdict(int)
for words in tokenized:
for i in range(len(words)):
for j in range(i+1, min(i+WINDOW, len(words))):
pair = tuple(sorted([words[i], words[j]]))
cooccur[pair] += 1

# 过滤:共现 < 10 的边去掉
cooccur = {p: c for p, c in cooccur.items() if c >= 10}

Step 2:构建图 + 计算中心度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import networkx as nx

G = nx.Graph()
# 边:共现频次
for (w1, w2), cnt in cooccur.items():
G.add_edge(w1, w2, weight=cnt)

# ★ 中心度:3 大指标
degree_cent = nx.degree_centrality(G) # 度中心度
betweenness_cent = nx.betweenness_centrality(G) # 介数中心度
closeness_cent = nx.closeness_centrality(G) # 接近中心度

# ★ 枢纽节点(度中心度 Top 20)
hub_words = sorted(degree_cent.items(), key=lambda x: -x[1])[:20]
print('枢纽词:')
for w, c in hub_words:
print(f' {w:8s} 中心度={c:.3f}')
# 输出: 客服(0.85)、快递(0.78)、质量(0.72)...

3 大中心度指标含义:

指标 含义 适合找
度中心度 直接连的节点数 流行词、热门话题
介数中心度 多少最短路径经过它 枢纽词(连接多个话题)
接近中心度 到其他节点的距离 核心词(信息源)

Step 3:社区检测 + 子图提取

1
2
3
4
5
6
7
8
9
10
11
from networkx.algorithms.community import louvain_communities

# Louvain 社区检测
communities = louvain_communities(G, resolution=1.0, seed=42)
print(f'发现 {len(communities)} 个社区')
for i, comm in enumerate(communities[:5], 1):
print(f' 社区 {i}({len(comm)} 词): {list(comm)[:8]}')
# 输出:
# 社区 1(15 词): ['快递', '送货', '物流', '速度', '及时', '破损', '丢件', '态度']
# 社区 2(12 词): ['质量', '做工', '材质', '手感', '不错', '一般', '粗糙', '精致']
# 社区 3(10 词): ['客服', '回复', '态度', '耐心', '处理', '解决', '退款', '速度']

自动分组! 老板一眼看出”快递/质量/客服”是 3 个用户痛点社区

1
2
3
4
5
6
7
8
# ★ 提取子图:只看枢纽词 + 它们的关系
hub_set = set(w for w, _ in hub_words)
subgraph = G.subgraph(hub_set).copy()

# 子图统计
print(f'子图节点数: {subgraph.number_of_nodes()}')
print(f'子图边数: {subgraph.number_of_edges()}')
print(f'子图密度: {nx.density(subgraph):.3f}')

三、可视化(pyecharts 关系图)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from pyecharts import options as opts
from pyecharts.charts import Graph

# 准备节点(含中心度 + 社区)
nodes = []
for word in G.nodes():
deg = degree_cent[word]
comm_id = next(i for i, c in enumerate(communities) if word in c)
nodes.append({
'name': word,
'symbolSize': 10 + deg * 50, # 中心度越大,点越大
'category': comm_id, # 社区 = 颜色组
'value': round(deg, 3),
})

# 边(只画 Top 1000,防太密)
top_edges = sorted(G.edges(data=True), key=lambda x: -x[2]['weight'])[:1000]
links = [{'source': u, 'target': v, 'value': d['weight']} for u, v, d in top_edges]

# 类别(社区配色)
categories = [{'name': f'社区{i+1}'} for i in range(len(communities))]

# 画图
Graph(init_opts=opts.InitOpts(width='1400px', height='900px'))
.add(
'',
nodes,
links,
categories,
layout='force',
repulsion=2000,
gravity=0.05,
edge_length=[50, 200],
linestyle_opts=opts.LineStyleOpts(curve=0.2, opacity=0.5),
label_opts=opts.LabelOpts(is_show=True, position='right', font_size=10),
)
.set_global_opts(
title_opts=opts.TitleOpts(title='评论语义网络图谱'),
legend_opts=opts.LegendOpts(orient='vertical', pos_left='left'),
)
.render('semantic_network.html')

输出效果:

四、实战:1 万条手机评论分析

任务:分析 1 万条”小米 14”评论,看用户最关心啥。

Step 1:跑出 200 个高频词,3 大社区:

社区 Top 词 占比 主题
1 续航、电池、充电、待机、快充 35% 电池续航
2 屏幕、显示、刷新率、亮度、护眼 28% 屏幕显示
3 拍照、相机、像素、长焦、夜景 22% 影像系统
4 性能、处理器、游戏、流畅、跑分 15% 性能跑分

Step 2:介数中心度 Top 5:

排名 介数中心度 含义
1 不错 0.32 万能评价词(连接所有话题)
2 续航 0.28 电池社区枢纽
3 屏幕 0.24 屏幕社区枢纽
4 性价比 0.19 横跨多个社区(连接价格 + 性能)
5 流畅 0.15 性能社区枢纽

老板决策:续航社区占比最高(35%) → 营销重点强调”5000mAh 大电池”。

五、踩坑大全

1. 节点太多画成”毛线球”

2. 中文显示为方框

3. 中心度算得慢(>5 万节点)

4. 社区检测每次结果不一样

5. 想看时间演化

六、软件功能

我们的 语义网络图谱软件 ¥19.80 把上面所有代码封装成 GUI:

功能 详情
节点控制 100-2000 节点滑动条
边控制 共现频次阈值、最低度过滤
中心度 3 大指标 + Top N 表格导出
社区检测 Louvain + 标签传播 + 手动漫聚类
子图提取 按中心度 / 社区 / 关键词 3 种方式
配色 8 套主题 + 节点大小映射中心度
导出 HTML / PNG(4K)/ Gephi GEXF / CSV
联动 共现网络图软件 出简化版,本软件出深度版

配套软件:

七、典型用户场景

① 论文研究:社科论文”用户评论主题网络结构”分析
② 商业洞察:电商评论里 5 大用户痛点社区 + 占比
③ 舆情监控:不同时间窗网络结构变化 → 看热点迁移
④ 学术综述:某领域 1000 篇论文关键词共现网络
⑤ 内容运营:爆款文章标题/正文高频词结构

八、立即试用

软件 售价 适用场景
语义网络图谱软件 ¥19.80 深度关系挖掘
共现网络图软件 ¥29.80 快速看关系
LDA 主题分析软件 ¥39.80 主题挖掘
LDA 主题演化分析 ¥69.00 时间演化
一站式文本分析套餐 ¥68.00 入门组合

本文由 小朵科技工作室 原创,专注 Python 关系图谱 6 年。