Skip to content

Entropyorder/Paper-Filter

Repository files navigation

Paper Filter

自动化论文搜索、筛选与下载管线,用于为大模型后训练数据收集具有边际知识逻辑复杂性高质量的学术论文。

快速开始

1. 安装依赖

uv sync

2. 配置 API Key

复制 .env.example.env,填入你的 API Key:

cp .env.example .env
AIHUBMIX_API_KEY=sk-your-key-here    # 必填,用于 Gemini LLM 筛选
UNPAYWALL_EMAIL=your@email.com        # 推荐,用于查找付费论文的开放获取版本
NCBI_API_KEY=                         # 可选,提高 PubMed 速率限制(10 req/s vs 3 req/s)
S2_API_KEY=                           # 可选,提高 Semantic Scholar 速率限制

3. 运行

# 运行全部学科
uv run python -m src.main

# 只运行指定学科
uv run python -m src.main --disciplines medicine computer_engineering

# 从中间结果恢复(搜索/去重阶段已完成时跳过重复执行)
uv run python -m src.main --resume

管线架构

搜索(多源并行)
  → 去重 + 元数据预筛
  → LLM 粗筛(并行批次,含学科归属验证)
  → 并发下载 PDF + 提取全文
  → LLM 精筛(并行,读全文)
  → 保留通过论文的 PDF,删除其余

搜索阶段

搜索源 策略 适用学科
arXiv 按学科分类标签浏览(date 排序) CS、物理、数学、金融
PubMed 按 MeSH 术语浏览,限英文 医学、公共卫生
Semantic Scholar 按期刊/会议名浏览(bulk API)+ 关键词补充 全学科

各学科可在 taxonomy.yaml 中用 sources_enabled 字段覆盖全局数据源配置。

筛选阶段(Gemini LLM)

  • 粗筛:10 篇/批,并行发送,每篇评分四个维度(1-5):
    • novelty:知识新颖性
    • complexity:逻辑复杂度
    • quality:论文质量
    • discipline_fit:学科归属(低于阈值直接淘汰,解决如语言学搜到 LLM 方法论文的问题)
  • 精筛:并行逐篇评估(1-10),读取 PDF 全文(不截断),输出 ACCEPT/REJECT 及推荐出题方向

下载阶段

按优先级逐渠道尝试:直接 OA 链接 → Unpaywall → arXiv → PMC

图片型 PDF(无文本层,需 OCR)自动丢弃。

配置

所有参数在 config.yaml 中配置:

参数 说明
search.time_range_years 搜索最近 N 年的论文
search.max_results_per_source 每个源每个子类别最大结果数
search.s2_request_interval S2 请求间隔(秒),无 key 时建议 2-5
prefilter.max_citation_count 引用数上限(排除已成主流的论文)
prefilter.exclude_pub_types 排除的发表类型(如 Review、Editorial)
filter.coarse.min_discipline_fit 学科归属最低分(1-5),低于则淘汰
filter.coarse.keep_top_n_per_discipline 粗筛后每学科保留数
filter.fine.target_per_discipline 精筛后每学科最大保留数
filter.fine.min_score 精筛最低平均分(1-10)
filter.fine.total_target 总目标论文数(仅用于末尾警告)
concurrency.llm_workers LLM 并行调用数(粗筛+精筛)
concurrency.download_workers PDF 并行下载数

学科配置(taxonomy.yaml)

每个学科和子类别映射到具体的搜索源参数:

linguistics:
  label: "语言学"
  sources_enabled: [arxiv, semantic_scholar]  # 可覆盖全局数据源
  search_hints: "..."                          # 搜索方向提示(送入 LLM)
  discipline_fit_hints: "..."                  # 学科边界说明(区分跨界论文)
  subcategories:
    morphology:
      label: "形态学"
      arxiv_categories: ["cs.CL"]
      pubmed_mesh: ["Psycholinguistics"]
      s2_fields: ["Linguistics"]
      venues: ["Language", "Morphology", ...]
      keywords: ["undocumented language morphology", ...]

扩展到新学科

只需在 taxonomy.yaml 中添加新条目,无需修改代码。

当前学科

学科 子类别数 主要搜索源
医疗 6 PubMed + S2
金融 6 arXiv (q-fin) + S2
天文/地理 2 arXiv (astro-ph) + S2
计算机工程 8 arXiv (cs.*) + S2
语言学 6 arXiv (cs.CL) + S2

输出结构

output/
└── {discipline}/
    ├── 1_search_results.json     # 原始搜索结果
    ├── 2_deduped.json            # 去重 + 预筛后
    ├── 3_coarse_filtered.json    # 粗筛后(按分数排序)
    ├── 4_fine_filtered.json      # 精筛后(含完整评分和推荐出题方向)
    └── pdfs/                     # 通过精筛的论文 PDF

测试

uv run python -m pytest tests/ -v

About

Automated pipeline for searching, filtering, and downloading academic papers for LLM training data

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages