共现网络原理与《釜山行》项目环境搭建(一)
共现网络原理与《釜山行》项目环境搭建(一)
标签:
Python3|共现网络|NLP|jieba|Gephi|人物关系提取
实验环境: 华为云 FlexusX 4 节点 Ubuntu 24.04 / Python 3.12.3
1. 什么是共现网络(Co-occurrence Network)
共现网络是文本挖掘和社交网络分析中的基础工具。它的核心思想非常直观:
如果两个词语(或人物、实体)在同一段文本“窗口”内一起出现,就认为它们之间存在某种关系;共同出现的次数越多,关系越强。
1.1 共现网络三要素
| 要素 | 含义 | 本项目对应 |
|---|---|---|
| 节点(Node) | 研究对象 | 《釜山行》电影人物 |
| 边(Edge) | 两个对象之间的关联 | 两个人物在文本中共同出现 |
| 权重(Weight) | 关联强度 | 共现次数 |
1.2 文本窗口的两种取法
- 段落窗口:同一自然段内出现的人物即视为共现,适合宏观把握篇章结构。
- 句子窗口:同一句子内出现的人物才视为共现,适合提取更紧密的语义关系。
本系列第一篇使用段落窗口构建全图;第二篇会对比不同窗口对网络结构的影响。
2. 项目整体架构
四台 8 vCPU / 16 GiB 的 FlexusX 服务器按如下方式分工,既充分使用资源,又把每个环节解耦:
192.168.0.195 (公网 1.94.202.19) ┌─────────────────────────────────┐ │ node-01 主力开发服务器 │ │ jieba 分词 + 文本处理 │ └────────────┬────────────────────┘ │ 192.168.0.215 (公网 120.46.159.92) │ ┌─────────────────────────────────┐ │ │ node-02 数据服务器 │ │ │ 电影文本 + 人物自定义词典 │ │ └────────────┬────────────────────┘ │ │ │ v v 192.168.0.147 (公网 124.70.105.142) 192.168.0.157 (公网 120.46.44.194) ┌─────────────────────────────────┐ ┌─────────────────────────────────┐ │ node-03 分析服务器 │ │ node-04 可视化服务器 │ │ NetworkX 构建图 │ │ matplotlib 静态图 │ │ 计算中心性 / 密度 / 路径 │ │ Gephi 安装与 GEXF 导入 │ └─────────────────────────────────┘ └─────────────────────────────────┘3. 服务器基本信息
| 节点 | 公网 IP | 私网 IP | 角色 | 主要软件 |
|---|---|---|---|---|
| node-01 | 1.94.202.19 | 192.168.0.195 | jieba 分词 / 文本处理 | Python 3.12.3, jieba 0.42.1 |
| node-02 | 120.46.159.92 | 192.168.0.215 | 数据 / 自定义词典 | Python 3.12.3, jieba |
| node-03 | 124.70.105.142 | 192.168.0.147 | 网络分析 | Python 3.12.3, networkx 3.6.1 |
| node-04 | 120.46.44.194 | 192.168.0.157 | 可视化 | Python 3.12.3, matplotlib 3.11.0 |
4. 环境准备
4.1 系统环境确认
四台服务器均使用 Ubuntu 24.04 LTS,已自带 Python 3.12.3:
root@ecs-11e6-0001:~# hostname && cat /etc/os-release | head -3 && python3 --versionecs-11e6-0001PRETTY_NAME="Ubuntu 24.04.4 LTS"NAME="Ubuntu"VERSION_ID="24.04"Python3.12.34.2 安装 Python 依赖
Ubuntu 24.04 启用了PEP 668,直接pip3 install会被拒绝,需要加--break-system-packages:
# 所有节点都安装 jiebapip3install--break-system-packages jieba# node-03 / node-04 额外安装 networkx 和 matplotlibpip3install--break-system-packages networkx matplotlib⚠️ 踩坑记录:第一次批量安装时,因网络较慢且多个
pip进程并发,导致 node-01 / node-04 出现死锁。处理办法:先killall -9 pip3 python3,然后每个节点单独用nohup后台安装,并通过python3 -c "import jieba; print(jieba.__version__)"验证。
4.3 依赖版本确认
root@ecs-11e6-0001:~# python3 -c "import jieba; print(jieba.__version__)"0.42.1 root@ecs-11e6-0003:~# python3 -c "import networkx; print(networkx.__version__)"3.6.1 root@ecs-11e6-0004:~# python3 -c "import matplotlib; print(matplotlib.__version__)"3.11.05. 中文字体准备(可视化节点 node-04)
matplotlib 在无头服务器上默认找不到中文字体,会导致中文乱码。需要安装fonts-noto-cjk:
root@ecs-11e6-0004:~# apt-get install -y fonts-noto-cjk脚本中动态查找字体:
font_paths=fm.findSystemFonts()cn_fonts=[]forfpinfont_paths:try:font=fm.FontProperties(fname=fp)name=font.get_name()if"cjk"inname.lower()or"noto"inname.lower():cn_fonts.append((fp,name))except:passifcn_fonts:fm.fontManager.addfont(cn_fonts[0][0])plt.rcParams["font.sans-serif"]=[cn_fonts[0][1]]实际输出:
找到中文字体: Noto Serif CJK JP6. 数据准备(node-02)
6.1 电影文本
在node-02上准备/root/busan_text.txt,内容覆盖《釜山行》主要情节段落,确保主要人物在同一段落中自然共同出现。文本结构示例:
《釜山行》人物关系分析文本 石宇是一个忙碌的基金经理,工作狂人,很少陪伴女儿秀安。秀安是个懂事的小女孩,母亲住在釜山。石宇决定带秀安乘坐KTX列车前往釜山找母亲。 在首尔站,石宇和秀安登上了前往釜山的列车。列车上还有许多人,尚华和他的妻子盛京,盛京怀着身孕。珍熙是一个活泼的女高中生,和她的男朋友容国一起出行。容国是棒球队的主力队员。英国是一家公司的运营部长,自私冷酷,只顾自己。列车上还有一对老姐妹,老姐姐和老妹妹,以及一个流浪的乞丐。列车长负责本次列车的运行。 ...6.2 自定义 jieba 词典
由于《釜山行》人名是音译,默认jieba不会识别为专有名词,必须自定义词典/root/busan_dict.txt:
石宇 999 nr 秀安 999 nr 尚华 999 nr 盛京 999 nr 珍熙 999 nr 英国 999 nr 容国 999 nr 老姐姐 999 nr 老妹妹 999 nr 乞丐 999 nr 列车长 999 nr每一行格式为:
词语 词频 词性nr表示人名(Named Entity)。- 词频
999只是为了让 jieba 优先切出这些词。
7. 文件清单
项目涉及的文件及所在节点:
| 文件 | 所在节点 | 说明 |
|---|---|---|
busan_text.txt | node-01 / node-02 / node-03 | 原始电影文本 |
busan_dict.txt | node-01 / node-02 / node-03 | 自定义人名词典 |
busan_segment.py | node-01 | jieba 分词与共现提取 |
nodes.csv/edges.csv | node-01 / node-03 | 节点与边 |
stats.json | node-01 / node-03 | 统计信息 |
busan_network.py | node-03 | NetworkX 网络分析 |
busan_network.gexf | node-03 / node-04 | Gephi 导入格式 |
busan_network.graphml | node-03 | GraphML 备用格式 |
busan_visualize.py | node-04 | matplotlib 可视化 |
busan_visualize_filtered.py | node-04 | 过滤版核心网络可视化 |
install_gephi.py | node-04 | Gephi 安装脚本 |
8. 下一篇预告
第二篇将在这套环境上运行jieba分词,基于段落窗口提取人物共现矩阵,并生成nodes.csv/edges.csv。会给出真实的服务器输出、完整的 Python 代码和每一行代码的注释。
9. 参考
- jieba 官方仓库:https://github.com/fxsjy/jieba
- NetworkX 文档:https://networkx.org/documentation/stable/
- Gephi 官方下载:https://gephi.org/users/download/