跳转至

阶段 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:数据关联

将奖项与类别关联以添加领域名称:

奖项 + 类别 → 含领域/类别名称的奖项
得主 + 匹配表 → 含 OpenAlex ID 的得主

步骤 5:输出 Parquet

清洗后的数据保存为 Parquet 文件以便高效下游处理:

  • output/clean_data/laureates.parquet
  • output/clean_data/awards.parquet
  • output/clean_data/publications.parquet
  • output/clean_data/institutions.parquet

样本模式

在样本模式(默认)下,仅处理 5 位代表性得主

SAMPLE_LAUREATE_IDS = [745, 102, 779, 114, 843]

这大幅减少了处理时间和输出大小,同时覆盖全部 4 个诺贝尔奖领域。

此外,您还可以使用 top_k_mode 模式来处理前 K 条数据:

# 示例:处理前 10 条数据
run(sample_mode=False, top_k_mode=True, k=10)

运行

# 通过流水线
uv run python main.py --phase 1

# 独立运行
uv run python -m src.data_loader