跳转至

src/content_enricher

阶段 1.5 模块,通过外部 API 和 OA PDF 富化论文内容。

函数

fetch_semantic_scholar(doi: str, cache_dir: str) → dict

从 Semantic Scholar API 获取摘要和 TLDR。

参数:

名称 类型 说明
doi str 论文 DOI
cache_dir str 缓存响应的目录

返回值: 包含 abstracttldr 键的字典(未找到时值为 None)。

副作用: 将响应缓存到 {cache_dir}/semantic_scholar/{doi_sanitized}.json。限速 1 请求/秒。


fetch_oa_fulltext(doi: str, pdf_url: str, cache_dir: str) → dict

下载开放获取 PDF 并提取全文。

参数:

名称 类型 说明
doi str 论文 DOI
pdf_url str OA PDF 直链 URL
cache_dir str 缓存目录

返回值: 包含 fulltext(提取的文本字符串)键的字典。


_extract_text_from_pdf(pdf_path: str) → str

使用 PyMuPDF(主要)或 pdfplumber(备选)从 PDF 文件提取文本。


_get_unpaywall_pdf_url(doi: str, cache_dir: str) → str | None

查询 Unpaywall API 获取指定 DOI 的开放获取 PDF URL。

返回值: PDF URL 字符串,未找到 OA 版本时返回 None


fetch_core_fulltext(doi: str, cache_dir: str) → dict

从 CORE API 获取全文。目前为占位实现。


enrich_content(publications: pl.DataFrame, cfg: dict, strategies: list[str] = None) → pl.DataFrame

主要富化编排器。按顺序应用富化策略。

参数:

名称 类型 默认值 说明
publications pl.DataFrame 论文 DataFrame
cfg dict 项目配置字典
strategies list[str] ["semantic_scholar", "oa_pdf"] 按顺序应用的策略

返回值: 更新后的 DataFrame,含 abstract_enrichedtldrfulltextcontent_source 列。


打印富化覆盖率统计(各策略富化了多少论文)。


run() → None

执行完整的阶段 1.5 流水线:

  1. 加载 publications.parquet
  2. 运行富化策略
  3. 打印统计
  4. 用富化数据覆盖 publications.parquet