系统架构¶
系统概览¶
诺贝尔奖知识图谱采用多阶段数据流水线架构,将原始的诺贝尔奖和学术论文数据转化为可交互、可查询的知识图谱。
flowchart TB
subgraph Input["输入数据"]
CSV[CSV 表格<br>757 位得主, 245K 篇论文]
JSON[JSON 文件<br>2.3GB 论文记录]
end
subgraph Phase1["阶段 1:数据基础"]
DL[data_loader.py<br>加载与清洗]
CE[content_enricher.py<br>内容富化]
end
subgraph Phase2["阶段 2:概念抽取"]
OA[openalex_enricher.py<br>API 富化]
LLM[concept_extractor.py<br>LLM 抽取]
end
subgraph Phase34["阶段 3+4:图谱构建"]
GB[graph_builder.py<br>构建知识图谱]
end
subgraph Phase5["阶段 5:输出"]
VIZ[visualize.py<br>交互式 HTML]
IA[insight_analyzer.py<br>分析报告]
end
CSV --> DL
JSON --> DL
DL --> CE
CE --> OA
OA --> LLM
LLM --> GB
GB --> VIZ
GB --> IA
style Input fill:#fff3e0
style Phase1 fill:#e3f2fd
style Phase2 fill:#f3e5f5
style Phase34 fill:#e8f5e9
style Phase5 fill:#fce4ec
数据流¶
逐阶段数据转换¶
| 阶段 | 输入 | 处理 | 输出 |
|---|---|---|---|
| 1 | CSV + JSONL | 加载、解码摘要、清洗 | laureates.parquet、awards.parquet、publications.parquet、institutions.parquet |
| 1.5 | publications.parquet |
Semantic Scholar API、OA PDF | 更新后的 publications.parquet(含富化摘要/全文) |
| 2a | publications.parquet |
OpenAlex API | 更新后的 publications.parquet(含概念/主题/领域) |
| 2b | publications.parquet + awards.parquet |
GPT-4o-mini LLM | llm_extraction_raw.json、concepts.parquet |
| 3+4 | 所有 Parquet + 概念 | NetworkX 图谱构建 | knowledge_graph.json、nodes.json、edges.json、.graphml |
| 5 | knowledge_graph.json |
Pyvis + Plotly | network.html、timeline.html、heatmap.html |
| 6 | knowledge_graph.json |
图谱分析算法 | insight_report.md、insight_report.json |
存储格式¶
flowchart LR
RAW[原始数据] -->|CSV/JSON| PARQUET[Parquet 文件]
PARQUET --> KG[知识图谱]
KG -->|JSON| JSON_OUT[knowledge_graph.json]
KG -->|GraphML| GRAPHML[knowledge_graph.graphml]
KG -->|分离式| NODES[nodes.json + edges.json]
KG -->|HTML| VIZ[交互式可视化]
核心设计决策¶
1. 分层概念抽取策略¶
并非所有 245K 篇论文都接受相同的处理。系统采用三层策略平衡成本和质量:
| 层级 | 论文 | 方法 | 成本 |
|---|---|---|---|
| Tier 1 | ~1,000 篇获奖相关 + 高引用 | LLM 深度抽取 | 高 |
| Tier 2 | ~30,000 篇高引用 | 关键词 + OpenAlex 概念 | 中 |
| Tier 3 | 其余论文 | 仅关键词粗粒度标注 | 低 |
2. 开发样本模式¶
流水线支持样本模式,仅处理 5 位代表性得主。这使得快速迭代成为可能,无需处理完整的 2.3GB 数据集。
3. 积极缓存¶
所有外部 API 调用(OpenAlex、Semantic Scholar、Unpaywall)均缓存为 JSON 文件:
output/openalex_cache/ # OpenAlex 论文数据
output/openalex_cache/fulltext/ # 各来源全文
output/openalex_cache/semantic_scholar/ # S2 API 响应
output/openalex_cache/unpaywall/ # Unpaywall OA 链接
4. 流式处理大文件¶
2.3GB 的 publication_records.json 以行分隔 JSON(JSONL)格式流式处理,避免将完整文件加载到内存。
5. NetworkX 作为主要图引擎¶
选择 NetworkX 是因为:
- 丰富的算法库(最短路径、中心性、社区检测)
- 便捷的 JSON 和 GraphML 序列化
- 无外部数据库依赖
对于生产级扩展,Schema 设计兼容 Neo4j。
模块依赖图¶
flowchart TD
INIT[src/__init__.py<br>配置加载] --> DL
INIT --> CE
INIT --> OA
INIT --> CX
INIT --> GB
INIT --> VIZ
INIT --> IA
DL[data_loader.py] --> CE[content_enricher.py]
CE --> OA[openalex_enricher.py]
OA --> CX[concept_extractor.py]
DL --> GB[graph_builder.py]
CX --> GB
GB --> VIZ[visualize.py]
GB --> IA[insight_analyzer.py]
MAIN[main.py<br>流水线运行器] -.->|编排| DL
MAIN -.-> CE
MAIN -.-> OA
MAIN -.-> CX
MAIN -.-> GB
MAIN -.-> VIZ
MAIN -.-> IA
技术栈¶
| 层面 | 技术 | 用途 |
|---|---|---|
| 数据处理 | Polars / Pandas | CSV/JSON 加载、清洗、变换 |
| NLP / 抽取 | OpenAI API (GPT-4o-mini) | 从摘要中提取技术概念 |
| 数据富化 | OpenAlex REST API | 论文概念、主题、领域分类 |
| 内容富化 | Semantic Scholar API、Unpaywall | 摘要和全文获取 |
| PDF 处理 | PyMuPDF | PDF 文本提取 |
| 图引擎 | NetworkX | 内存图操作与算法 |
| 可视化 | Pyvis、Plotly | 交互式 HTML 可视化 |
| 序列化 | JSON、GraphML、Parquet | 数据持久化 |
| 环境管理 | uv | Python 包和环境管理 |
| 配置 | YAML + dotenv | 设置和密钥管理 |