mcpField
F
find-papers

find-papers

github.com/shaishavmaisuria生产力57113 次安装4 天前更新
代码仓库

关于 find-papers

find-papers 面向开展文献综述和相关工作检索的研究者。它查询四个学术索引,统一会议名称,并通过故障转移整合结果、报告覆盖情况。

主要功能

  1. 01按主题、作者、会议、年份或标识符检索
  2. 02合并并去重四个索引的结果
  3. 03沿引用关系扩展检索结果
  4. 04解析规范记录与标题变体
  5. 05报告索引覆盖情况与部分结果

适用场景

  1. 01为文献综述整理论文清单
  2. 02按会议和年份列出论文
  3. 03查找高被引论文或最新 arXiv 预印本
  4. 04从种子论文扩展查找基础工作与竞品

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/shaishavmaisuria/research-paper-lifecycle-skills --skill find-papers

安装后在 Claude Code 中输入/find-papers确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
api-notes.md
citation-graph-expansion.md
venue-aliases.md
scripts/
arxiv_search.py
citation_graph.py
crossref_search.py
dblp_search.py
polite_http.py
resolve_canonical.py
resolve_papers.py
s2_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 的所有论文”)DBLPdblp_search.py
DOI 支持的元数据、出版方筛选条件、日期范围Crossrefcrossref_search.py
摘要、引用次数、开放获取 PDF 链接、主题搜索Semantic Scholars2_search.py
预印本、最新研究、全文 HTML 链接arXivarxiv_search.py
分发查询至各索引、合并结果、故障转移、报告覆盖情况全部四个resolve_papers.py
沿引用关系扩展已饱和的种子集(锚点、竞争作品、基础设施)OpenAlex + Crossrefcitation_graph.py
选出命名标题的规范版本(版本漂移/标题冲突)任意(后处理)resolve_canonical.py

对于任何你打算呈现为相对完整的综述或发表场所枚举,请优先使用 resolve_papers.py:它会查询多个索引,按任意稳定 ID(DOI、arXiv、DBLP 或 anthology)去重后合并命中结果(不要求 DOI),在某个索引被限流或宕机时继续运行,并将结果标记为 COMPLETE 或 PARTIAL。单一提供方脚本适用于特定任务(查询 DOI、获取 DBLP 目录、查找最新 arXiv 预印本)——切勿将某个提供方没有结果视为论文不存在的证据。

详情、速率限制和故障转移矩阵:references/api-notes.md。

流程

  1. 先解析发表场所身份(纯主题搜索时跳过)。 各 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 重新核验;配置文件和别名表都可能过时,文件本身也有说明。
  2. 确保已设置 CONTACT_EMAIL。 如有需要,请向用户索要邮箱:export [email protected]。切勿捏造邮箱。

  3. 从技能目录运行合适的脚本(所有脚本都仅依赖 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 小时、每次仅获取单页)。不要循环运行脚本来绕过其分页上限;应改进查询。

  4. 交叉核验、沿引用图扩展并补充信息。 按任意稳定 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。

  5. 解析到规范实例,而不只是某个匹配项。 当用户指定了某篇论文(而非搜索某个主题)时,按相关性排序的搜索很容易返回一个相邻实例:它虽通过了简单的存在性检查,却不是正确的引用对象。例如,社区已有规范的后续版本时,搜索结果可能是较早版本(版本 / 版次漂移);也可能是共享第一作者且标题近似重复的另一篇论文(标题冲突)。在介绍任何单篇“该”论文之前,应先使用检查工具处理候选项:

    # 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 返回的规范字符串,而不是凭记忆或手动输入标题,并在备注中保留各个变体,以便审计所选形式。这样可以避免书目和语料库中同一作品的标题出现分歧。

  6. 交接。

    • 需要全文 → 使用 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。
  • 遵守内置的速率限制;绝不批量抓取,绝不翻阅整个语料库,绝不从请求中删除联系邮箱。
  • 绝不代表用户向任何系统提交任何内容。

评论

支持 Markdown