关于 find-papers
find-papers 面向开展文献综述和相关工作检索的研究者。它查询四个学术索引,统一会议名称,并通过故障转移整合结果、报告覆盖情况。
主要功能
- 01按主题、作者、会议、年份或标识符检索
- 02合并并去重四个索引的结果
- 03沿引用关系扩展检索结果
- 04解析规范记录与标题变体
- 05报告索引覆盖情况与部分结果
适用场景
- 01为文献综述整理论文清单
- 02按会议和年份列出论文
- 03查找高被引论文或最新 arXiv 预印本
- 04从种子论文扩展查找基础工作与竞品
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ shaishavmaisuria/ research-paper-lifecycle-skills --skill find-papers安装后在 Claude Code 中输入/find-papers确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/api-notes.mdcitation-graph-expansion.mdvenue-aliases.mdscripts/arxiv_search.pycitation_graph.pycrossref_search.pydblp_search.pypolite_http.pyresolve_canonical.pyresolve_papers.pys2_search.py详细介绍
查找论文
无需密钥的学术搜索。从四个免费 API 获取经验证的论文元数据——标题、作者、年份、发表场所、DOI/arXiv 编号、引用次数、开放获取 PDF 链接——并提供发表场所名称转换层,让跨 API 搜索真正可用。服务于文献综述和相关工作阶段;为 fetch-paper(全文)和 verify-citations(参考文献核验关卡)提供数据。
适用场景
- “查找关于 X 的论文”/“调查 X 的相关工作”
- “列出 发表的所有论文”
- “关于 X 被引次数最高的论文有哪些?”/“查找这个 DOI”
- “arXiv 上关于 X 有什么新内容?”
- 其他技能(literature-review、draft-related-work、study-exemplars、select-venue)需要真实论文作为输出依据
输入
- 主题、作者、发表场所、年份、DOI 或 arXiv 编号(可任意组合)
CONTACT_EMAIL环境变量——所有脚本都必需(礼貌访问池身份标识);若未设置,脚本会交互式提示输入,或以状态码 1 退出并给出说明- 可选:
S2_API_KEY环境变量,用于可靠访问 Semantic Scholar - 可选:发表场所配置文件
venues/conferences/<id>.yml(架构见venues/schema.yml)——其中的aliases:块是权威的发表场所名称映射
提供方速查表
| 需求 | 提供方 | 脚本 |
|---|---|---|
| 枚举某个计算机科学发表场所某一年的论文(“KDD 2025 的所有论文”) | DBLP | dblp_search.py |
| DOI 支持的元数据、出版方筛选条件、日期范围 | Crossref | crossref_search.py |
| 摘要、引用次数、开放获取 PDF 链接、主题搜索 | Semantic Scholar | s2_search.py |
| 预印本、最新研究、全文 HTML 链接 | arXiv | arxiv_search.py |
| 分发查询至各索引、合并结果、故障转移、报告覆盖情况 | 全部四个 | resolve_papers.py |
| 沿引用关系扩展已饱和的种子集(锚点、竞争作品、基础设施) | OpenAlex + Crossref | citation_graph.py |
| 选出命名标题的规范版本(版本漂移/标题冲突) | 任意(后处理) | resolve_canonical.py |
对于任何你打算呈现为相对完整的综述或发表场所枚举,请优先使用 resolve_papers.py:它会查询多个索引,按任意稳定 ID(DOI、arXiv、DBLP 或 anthology)去重后合并命中结果(不要求 DOI),在某个索引被限流或宕机时继续运行,并将结果标记为 COMPLETE 或 PARTIAL。单一提供方脚本适用于特定任务(查询 DOI、获取 DBLP 目录、查找最新 arXiv 预印本)——切勿将某个提供方没有结果视为论文不存在的证据。
详情、速率限制和故障转移矩阵:references/api-notes.md。
流程
-
先解析发表场所身份(纯主题搜索时跳过)。 各 API 中的发表场所名称都不相同,字符串错误会悄无声息地返回零条结果。解析顺序:
venues/conferences/<id>.yml→aliases:块(dblp_key、s2_venue、 crossref_container),前提是配置文件存在;- 否则查看 references/venue-aliases.md
(约 20 个顶级发表场所,并注明各自的特殊情况:SIGSPATIAL =
conf/gis、 VLDB = 按卷号归入journals/pvldb、2023 年之后的 SIGMOD = PACMMOD、 NeurIPS 目录重命名、Crossref 中没有 ICLR/ICML……); - 否则在线查找:运行
python3 scripts/dblp_search.py --find-venue "<name>",然后按 venue-aliases.md 中的“添加或重新验证发表场所”操作。 如果发表场所配置文件提供了用户会据以判断的事实(计数、覆盖范围声明、附带提及的截止日期),请对照配置文件中的实时cfp_url和实时 API 重新核验;配置文件和别名表都可能过时,文件本身也有说明。
-
确保已设置
CONTACT_EMAIL。 如有需要,请向用户索要邮箱:export [email protected]。切勿捏造邮箱。 -
从技能目录运行合适的脚本(所有脚本都仅依赖 Python 3 标准库;均支持
--help、--json、--no-cache):# Provider-agnostic fan-out (PREFER for surveys / "is this complete?"): # unions DBLP+Crossref+S2+arXiv, fails over on any outage, prints a # COMPLETE/PARTIAL coverage banner. python3 scripts/resolve_papers.py --query "trajectory similarity learning" python3 scripts/resolve_papers.py --venue-year --year 2025 \ --dblp-key conf/gis --s2-venue "SIGSPATIAL/GIS" \ --crossref-container "Advances in Geographic Information Systems" # Enumerate a venue-year (conference / journal volume / multi-volume toc) python3 scripts/dblp_search.py --key conf/gis --year 2025 python3 scripts/dblp_search.py --key journals/pvldb --volume 18 python3 scripts/dblp_search.py --toc db/conf/acl/acl2024-1.bht # Topic search with citation counts + OA PDFs (add --year to narrow) python3 scripts/s2_search.py --query "trajectory similarity learning" --limit 10 # Venue search on S2 (exact venue string from the alias table!) python3 scripts/s2_search.py --venue "SIGSPATIAL/GIS" --year 2025 # DOI-backed venue/date/type filtering python3 scripts/crossref_search.py --container SIGSPATIAL \ --from-date 2025-01-01 --until-date 2025-12-31 --type proceedings-article # Fresh preprints python3 scripts/arxiv_search.py \ --query 'cat:cs.DB AND abs:"spatial join"' --sort submittedDate # Expand a saturated seed set along the citation graph (see step 4) python3 scripts/citation_graph.py \ --seed DOI:10.14778/3551793.3551844 --seed "<another on-topic title>" \ --direction both --top 25脚本会自行遵守礼貌请求规范(每个主机每秒 1 个请求——DBLP 间隔 2 秒,arXiv 间隔 3 秒——带联系邮箱的 UA、429 指数退避、在
.cache/find-papers/下缓存 24 小时、每次仅获取单页)。不要循环运行脚本来绕过其分页上限;应改进查询。 -
交叉核验、沿引用图扩展并补充信息。 按任意稳定 ID 去重,而不只是 DOI(DOI → arXiv ID → DBLP 键 → ACL-anthology ID);若都没有,则回退到标准化后的标题+年份——
resolve_papers.py会为你完成这一合并。缺少 DOI 不是丢弃论文的理由:真实的 ML 会议论文集作品(ICLR/ICML/NeurIPS)和现代 EDBT 论文不会分配 Crossref DOI,但其 arXiv/DBLP/anthology ID 完全可以作为引用标识。要区分两种看起来相似、但必须采用相反处理方式的失败情况:任何地方都找不到可验证的标识符 → 作为不可用结果丢弃;某个提供方宕机 / 被限流 → 这不等于“0 个结果”——应在其他索引中重新查询该论文;如果仍未确认,则将其标记为unresolved-keep,而不是因为单个索引未命中就丢弃。DBLP 提供权威的会议列表,但没有摘要或引文——逐篇补充感兴趣的结果:python3 scripts/s2_search.py --paper DOI:10.1145/3589132.3625571 --fields title,abstract,tldr,citationCount,openAccessPdf。arXiv 上的结果不等于已录用论文——在将其作为已录用论文介绍前,需通过 DBLP/Crossref 确认其会议录用情况。关键词 / 会议检索遍历饱和后必须执行(新查询返回的论文大多已在结果中):主题搜索会系统性地漏掉三类仅隔一个引用边的内容——子领域赖以建立的基础性 / 开创性锚点、共享引用者但不包含你的关键词的直接竞争工作,以及每篇论文都会引用、但主题查询中都不会提及的共享基础设施依赖项。这些内容要沿边查找,而不是靠关键词;跳过此阶段是召回率偏低的最大原因。选取最切题的种子论文,运行引用图扩展:
python3 scripts/citation_graph.py --seed DOI:<seed1> --seed "<seed2 title>" \ --direction both --top 25 # refs=anchors/infra, citedby=competitors它会从 OpenAlex 获取两个方向的边(被引论文的参考文献 + 引用该论文的文献;在缺少密钥的情况下,以 Crossref 的
reference数组作为参考文献回退),并按共引度重新排列邻居——即每篇邻居与多少个种子论文有关联——以便将关键词检索无法发现的高关联度枢纽排到前面。接下来:- 基础性 / 开创性锚点扫描,按主题簇进行:运行
--direction refs,阅读全局引用数最高的结果,并确认每个主题簇都包含显而易见的基础工作(基础模型、标志性数据集、开创性方法);若缺少,则说明存在召回缺口。 - 覆盖细分方向,而不只是经典工作:从简报中提取有辨识度的机制名词短语(具体命名的技术 / 组件 / 损失,而非泛化主题词),构造范围窄、目标明确的查询;将新发现的切题结果加入种子并再次扩展。
每个图邻居都是候选项,而非结果——介绍前须确认会议 / 录用情况,并说明其出现的原因(种子度数、边),由用户决定范围。方法和端点见:references/citation-graph-expansion.md。
- 基础性 / 开创性锚点扫描,按主题簇进行:运行
-
解析到规范实例,而不只是某个匹配项。 当用户指定了某篇论文(而非搜索某个主题)时,按相关性排序的搜索很容易返回一个相邻实例:它虽通过了简单的存在性检查,却不是正确的引用对象。例如,社区已有规范的后续版本时,搜索结果可能是较早版本(版本 / 版次漂移);也可能是共享第一作者且标题近似重复的另一篇论文(标题冲突)。在介绍任何单篇“该”论文之前,应先使用检查工具处理候选项:
# pipe a title search straight in (works with any search script's --json) python3 scripts/s2_search.py --query "<the named title>" --json \ | python3 scripts/resolve_canonical.py --stdin --title "<the named title>"它会将近似重复的标题聚类,标记
[VERSION DRIFT]和[TITLE COLLISION],并通过一行CHOOSE:说明标出一个PREFERRED选项(版本漂移时选最新的规范版本;标题冲突时选影响力最高或年份最早的奠基性论文)。PREFERRED选项只是建议——应展示同组论文,让用户审慎选择。绝不要悄悄将整个簇合并为一条记录。如果同组记录共享稳定 ID,但表面标题不同,解析器会输出
title_variants(该作品出现过的所有不同标题)。先按稳定 ID 匹配和去重,再按标题处理——同一 DOI/eprint 的另一种标题是别名,而非另一篇论文,绝不能将其计为未命中。选定实例后,将条目的标题字段替换为 API 针对该确切 ID 返回的规范字符串,而不是凭记忆或手动输入标题,并在备注中保留各个变体,以便审计所选形式。这样可以避免书目和语料库中同一作品的标题出现分歧。 -
交接。
- 需要全文 → 使用
fetch-paper技能(Unpaywall/arXiv/ACM-OA,按需获取,临时处理)。 - 结果将用于书目或任何书面论述 →
使用
verify-citations技能。绝不要输出本技能实际上并未检索到的引文。
- 需要全文 → 使用
输出
以 Markdown 表格形式呈现去重后的结果列表(标题、作者、年份、出版场所、DOI/arXiv ID、引用数、开放获取链接),并附上实际使用的确切脚本命令(以便复现搜索)。如果要将结果传入用户要求的文件,请使用 --json。如实报告总数与展示数量;如果某个提供方失败(例如 S2 的 429 错误重试耗尽),应明确说明,不要凭记忆填补缺失内容。
为每条结果标注证据等级,并确保标题为规范形式。 如果某条结果仅来自引文图边或单个关键词命中,它只是一个候选项,而不是对某篇特定论文的已确认引文:请标注来源(图谱 / 关键词 / 种子节点度数),让下游使用者可以按置信度筛选,而不是将所有条目视为同等可靠。如果目标是论文参考文献中的一个已知子集,应单独报告该子集的召回率,并报告相对于预期完整数量的精确率范围——绝不要将额外抓取的邻近论文与已确认命中项以同等置信度呈现。对于每条保留的记录,都应从其已解析 ID 对应的规范记录中逐字获取标题(不要手动输入或凭记忆填写),并规范化为出版方/DOI 规范的大小写形式;在任何 BibTeX 中,专有名词和首字母缩略词都应加上大括号,以保留其出版时的形式——这样可以避免标题虽然通过模糊匹配,却未通过严格字符串查询。
始终明确报告覆盖情况判定。 使用 resolve_papers.py 扩展搜索范围时,应向用户重述其 COMPLETE/PARTIAL 标识及各提供方的状态。如果运行结果为 PARTIAL——任何权威索引无法访问或受到速率限制——请明确说明结果仅供参考,可能因提供方原因而非相关性原因遗漏真实且相关的论文;并提出稍后重试或使用 S2_API_KEY 重试。绝不要将降级运行结果说成穷尽式搜索,也绝不要悄悄缩小范围,只采用恰好有响应的那个提供方。
参考资料
- references/venue-aliases.md — 四个 API 中约 20 个顶级出版场所的别名表、各出版场所的注意事项、验证来源,以及如何添加出版场所
- references/api-notes.md — 各 API 的操作说明、速率限制、许可、回退矩阵,以及提供方覆盖/优雅故障转移约定(
resolve_papers.py) - references/citation-graph-expansion.md — 引文图召回阶段:边方向、共同引用重排序、基础性锚点扫描、由论述驱动的细分领域检索,以及无需密钥的 OpenAlex/Crossref 端点
防护措施
- 绝不捏造论文、DOI、引用次数或“我找到了 N 篇论文”之类的声明——所有展示的结果都必须来自本次会话中的实际 API 响应。文献条目必须通过
verify-citations核验。 - 提供方中断 ≠ 没有结果,只有一个提供方存活 ≠ 搜索完整。索引不可用或触发速率限制时,切换到其他索引(任何“完整”声明都至少需要 2 个独立索引),遇到单个索引未命中时,将未经确认的论文保留为
unresolved-keep,而不是直接丢弃,并将本次运行标记为 PARTIAL。论文有 arXiv / DBLP / anthology ID 时,缺少 DOI 绝不是丢弃论文的理由。绝不能将 PARTIAL 运行报告为穷尽式搜索。 - PARTIAL 运行是需要重试的关卡,而不是终点。 脚本在放弃前已经会以指数退避方式重试 429/5xx;如果运行仍返回 PARTIAL(某个提供方已耗尽重试次数),不要因为存活的索引“碰巧覆盖”了目标就接受其为已完成——否则召回就只能靠运气。在声明本轮已完成之前,应在冷却一段时间后重新执行失败的环节(并为 Semantic Scholar 提供
S2_API_KEY),或改用等效的提供方。如果某个目标只能通过回退路径找回,必须在溯源信息中明确列出该标题,以便审查这一缺口,而不是悄然将其略过。 - 按必需的聚类检查完成情况,而不只是按运行检查。 对于范围界定标记为核心的任何聚类(直接竞争对手或主要贡献聚类),只有在至少 2 个独立索引实际响应了该聚类的查询后,才可视为已覆盖;即使整体运行标记为 COMPLETE,仅由一个存活的提供方确认的核心聚类也属于降级状态,而非已完成。
- 对于指定论文,仅确认其存在还不够:较早的版本或同一作者的近似重复标题,可能会通过简单匹配,却对应了错误的引用。使用
resolve_canonical.py解析候选项,优先选择最新的规范版本 / 影响力更高的实例,并列出相关条目供用户选择——绝不能在未标明的情况下自动合并为一条。 - 引用图邻居(
citation_graph.py)是召回候选项,不是结果:展示前必须确认会议 / 接收情况,绝不能将原始邻居计为“找到的论文”,并说明种子论文的度数 / 边缘关系原因,让人工决定范围,而不是自动纳入。 - 版权:元数据可安全使用(DBLP 为 CC0,Crossref 提供事实信息);摘要和全文按需获取并临时处理——绝不能将其提交到代码仓库或打包到输出中。展示 Semantic Scholar 数据时,注明其许可为 ODC-BY。
- 遵守内置的速率限制;绝不批量抓取,绝不翻阅整个语料库,绝不从请求中删除联系邮箱。
- 绝不代表用户向任何系统提交任何内容。