阶段 1:数据加载与清洗¶
模块: src/data_loader.py
预计耗时: ~2 天(完整数据集)
目标¶
将所有原始 CSV 和 JSON 数据加载到 Python 中,解码 OpenAlex 倒排索引格式的摘要,清洗数据,输出结构化的 Parquet 文件供下游处理使用。
输入数据¶
CSV 表格(data/26963326/db_data/)¶
| 文件 | 记录数 | 核心字段 |
|---|---|---|
laureate.csv |
757 | 姓名、性别、国籍、学历、Wikipedia/Wikidata |
award_info.csv |
761 | 获奖年份、类别、获奖理由、奖金 |
nobel_prize_category.csv |
4 | 经济学、物理学、化学、生理学/医学 |
laureate_openalex_matching.csv |
~840 | 得主 ↔ OpenAlex 作者 ID 匹配 |
institution.csv |
~13K | 机构名称、ROR、地理位置 |
work.csv |
~245K | 标题、关键词、摘要(倒排索引)、引用、DOI、年份 |
work_authorship.csv |
~1.67M | 论文-作者-机构关系 |
work_citation_by_year.csv |
~9M | 逐年引用计数 |
JSON 数据(data/26963326/json/)¶
| 文件 | 大小 | 内容 |
|---|---|---|
publication_records.json |
2.3 GB | 253K 篇论文的 JSONL 完整元数据 |
laureate_info.json |
924 KB | 得主详情(含地理坐标) |
award_details.json |
664 KB | 奖项详情(含地理坐标) |
处理步骤¶
步骤 1:加载 CSV 数据¶
使用 Polars 高性能列式处理加载所有 CSV 文件:
laureates = pl.read_csv(data_dir / "laureate.csv")
awards = pl.read_csv(data_dir / "award_info.csv")
categories = pl.read_csv(data_dir / "nobel_prize_category.csv")
matching = pl.read_csv(data_dir / "laureate_openalex_matching.csv")
institutions = pl.read_csv(data_dir / "institution.csv")
步骤 2:解码摘要¶
OpenAlex 将摘要存储为倒排索引——从每个单词到其在文本中位置的映射。decode_abstract() 函数重建可读文本:
# 输入: {"the": [0, 5], "Nobel": [1], "Prize": [2], ...}
# 输出: "the Nobel Prize ... the ..."
def decode_abstract(inverted_index: dict) -> str:
if not inverted_index:
return ""
words = {}
for word, positions in inverted_index.items():
for pos in positions:
words[pos] = word
return " ".join(words[i] for i in sorted(words.keys()))
步骤 3:流式加载论文¶
2.3 GB JSONL 文件通过流式读取按得主过滤加载:
def load_publications_sample(json_path, laureate_ids, max_per_laureate=100):
"""流式读取 JSONL,按得主过滤,每人最多取 N 篇。"""
步骤 4:数据关联¶
将奖项与类别关联以添加领域名称:
步骤 5:输出 Parquet¶
清洗后的数据保存为 Parquet 文件以便高效下游处理:
output/clean_data/laureates.parquetoutput/clean_data/awards.parquetoutput/clean_data/publications.parquetoutput/clean_data/institutions.parquet
样本模式¶
在样本模式(默认)下,仅处理 5 位代表性得主:
这大幅减少了处理时间和输出大小,同时覆盖全部 4 个诺贝尔奖领域。
此外,您还可以使用 top_k_mode 模式来处理前 K 条数据: