288 lines
12 KiB
Markdown
288 lines
12 KiB
Markdown
---
|
||
name: sn-search-academic
|
||
description: "多源学术搜索:ArXiv、Semantic Scholar(含引用数)、PubMed、Wikipedia。支持按章节读取 ArXiv HTML 全文和 PMC 全文。触发词:学术论文、文献调研、引用数据、生物医学文献、百科查询。一站式多源工具。"
|
||
---
|
||
|
||
# sn-search-academic - 学术搜索
|
||
|
||
搜索 ArXiv、Semantic Scholar、PubMed、Wikipedia 四个学术平台,并提供 ArXiv 和 PMC 的**全文章节阅读**能力。全部免费,部分脚本有可选 API key 可提升限额。
|
||
|
||
## 依赖
|
||
|
||
运行脚本前先安装本 skill 的 Python 依赖:
|
||
|
||
```bash
|
||
python3 -m pip install -r skills/sn-search-academic/requirements.txt
|
||
```
|
||
|
||
如果项目使用 `uv` 环境:
|
||
|
||
```bash
|
||
uv pip install -r skills/sn-search-academic/requirements.txt
|
||
```
|
||
|
||
`arxiv_paper.py` 需要 `beautifulsoup4` 解析 ArXiv HTML;其他脚本主要依赖 `httpx` 发起请求。
|
||
|
||
## 可用脚本
|
||
|
||
| 脚本 | 平台 | 用途 | API key |
|
||
|------|------|------|---------|
|
||
| `arxiv_search.py` | ArXiv | 预印本搜索,支持作者/标题/ID查询 | 无需 |
|
||
| `arxiv_paper.py` | ArXiv HTML | 按章节读取 ArXiv 论文全文 | 无需 |
|
||
| `semantic_scholar_search.py` | Semantic Scholar | 全学科搜索,含引用数和 TLDR | 无需(有 key 限额更高) |
|
||
| `semantic_scholar_refs.py` | Semantic Scholar | 引用追溯:查论文的参考文献(backward)或被引论文(forward) | 无需(有 key 限额更高) |
|
||
| `pubmed_search.py` | PubMed | 生医文献搜索,含结构化摘要和 PMC ID | 无需(有 key 限额更高) |
|
||
| `pmc_paper.py` | PMC | 按章节读取 PMC 开放获取论文全文 | 无需(有 key 限额更高) |
|
||
| `wikipedia_search.py` | Wikipedia | 百科文章搜索,支持多语言 | 无需 |
|
||
|
||
## 参数说明
|
||
|
||
### arxiv_search.py
|
||
|
||
```bash
|
||
python3 scripts/arxiv_search.py <query> [选项]
|
||
```
|
||
|
||
| 参数 | 说明 | 默认值 |
|
||
|------|------|--------|
|
||
| `query` | 搜索关键词(使用 `--id-list` 时可省略) | — |
|
||
| `--limit`, `-n` | 返回结果数量 | 10 |
|
||
| `--category`, `-c` | ArXiv 分类过滤(见下方"ArXiv 分类速查") | — |
|
||
| `--sort` | 排序方式:`relevance`, `date`, `submitted` | relevance |
|
||
| `--author`, `-a` | 按作者过滤,多个用逗号分隔 | — |
|
||
| `--title-only` | 仅在标题中搜索 | — |
|
||
| `--id-list` | 直接按 arXiv ID 获取元数据,逗号分隔 | — |
|
||
|
||
```bash
|
||
python3 scripts/arxiv_search.py "transformer attention mechanism" --limit 5
|
||
python3 scripts/arxiv_search.py "diffusion model" --author "ho jonathan" --category cs.CV
|
||
python3 scripts/arxiv_search.py --id-list "2409.05591,2301.07041"
|
||
```
|
||
|
||
**输出字段**:`title`, `url`, `snippet`(摘要), `arxiv_id`, `authors`, `published`, `updated`, `pdf_url`, `html_url`, `categories`, `primary_category`, `comment`, `journal_ref`, `doi`
|
||
|
||
### arxiv_paper.py
|
||
|
||
按章节读取 ArXiv 论文正文(需论文有 HTML 版本,2020 年后多数论文支持)。
|
||
|
||
```bash
|
||
python3 scripts/arxiv_paper.py <arxiv_id> [--section SECTION_NAME]
|
||
```
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| `arxiv_id` | arXiv ID(如 `2409.05591` 或 `2409.05591v2`) |
|
||
| `--section`, `-s` | 章节名(大小写不敏感,支持部分匹配)。不指定则列出所有章节。 |
|
||
|
||
```bash
|
||
python3 scripts/arxiv_paper.py 2409.05591 # 列出章节
|
||
python3 scripts/arxiv_paper.py 2409.05591 --section introduction
|
||
python3 scripts/arxiv_paper.py 2409.05591 --section method
|
||
```
|
||
|
||
**列出章节输出字段**:`arxiv_id`, `abs_url`, `html_url`, `pdf_url`, `section_count`, `sections[]`(name, level)
|
||
|
||
**读取章节输出字段**:`arxiv_id`, `section`, `level`, `content`, `char_count`
|
||
|
||
### semantic_scholar_search.py
|
||
|
||
```bash
|
||
python3 scripts/semantic_scholar_search.py <query> [选项]
|
||
```
|
||
|
||
| 参数 | 说明 | 默认值 |
|
||
|------|------|--------|
|
||
| `query` | 搜索关键词(必填) | — |
|
||
| `--limit`, `-n` | 返回结果数量 | 10 |
|
||
| `--api-key` | Semantic Scholar API Key(也可通过 `S2_API_KEY` 环境变量) | — |
|
||
|
||
```bash
|
||
python3 scripts/semantic_scholar_search.py "transformer architecture" --limit 5
|
||
python3 scripts/semantic_scholar_search.py "RLHF language model" --limit 10
|
||
```
|
||
|
||
**输出字段**:`title`, `url`, `snippet`(摘要,缺失时降级为 tldr), `tldr`, `authors`, `year`, `venue`, `publication_date`, `citation_count`, `influential_citation_count`, `reference_count`, `is_open_access`, `open_access_pdf`, `fields_of_study`, `publication_types`, `doi`, `arxiv_id`, `paper_id`
|
||
|
||
### semantic_scholar_refs.py
|
||
|
||
引用追溯:给定一篇论文,查询它的参考文献(backward)或被引论文(forward)。
|
||
|
||
```bash
|
||
python3 scripts/semantic_scholar_refs.py <paper_id> <direction> [选项]
|
||
```
|
||
|
||
| 参数 | 说明 | 默认值 |
|
||
|------|------|--------|
|
||
| `paper_id` | 论文标识符:S2 ID、DOI(`10.xxxx/...`)、ArXiv ID(`2301.07041`)、PMID(`PMID:12345678`) | — |
|
||
| `direction` | `references`=参考文献(backward),`citations`=被引论文(forward) | — |
|
||
| `--limit`, `-n` | 返回结果数量 | 20 |
|
||
| `--min-citations` | 最低引用数过滤 | 0 |
|
||
| `--year-min` | 最早年份过滤 | — |
|
||
| `--year-max` | 最晚年份过滤 | — |
|
||
| `--api-key` | Semantic Scholar API Key(可选) | — |
|
||
|
||
```bash
|
||
# 查看某篇论文引用了哪些论文(backward:找奠基工作)
|
||
python3 scripts/semantic_scholar_refs.py 2301.07041 references --limit 10
|
||
|
||
# 查看某篇论文被谁引用(forward:找后续进展)
|
||
python3 scripts/semantic_scholar_refs.py 2301.07041 citations --limit 10 --min-citations 50
|
||
|
||
# 用 DOI 查引用,限定 2023 年以后
|
||
python3 scripts/semantic_scholar_refs.py "10.1038/s41586-024-07487-w" citations --year-min 2023
|
||
|
||
# 找高引参考文献
|
||
python3 scripts/semantic_scholar_refs.py ARXIV:2005.14165 references --min-citations 100 --limit 5
|
||
```
|
||
|
||
**输出字段**:`title`, `url`, `snippet`(摘要/tldr), `authors`, `year`, `venue`, `citation_count`, `influential_citation_count`, `is_open_access`, `open_access_pdf`, `doi`, `arxiv_id`, `paper_id`, `citation_contexts`(引用上下文句子,最多 3 条), `citation_intents`(引用意图)
|
||
|
||
**输出额外字段**:`source_paper`(被查询论文的标题/年份/引用数), `total_available`(该方向总论文数), `returned`(过滤后返回数)
|
||
|
||
### pubmed_search.py
|
||
|
||
支持 PubMed 查询语法,如字段限定(`cancer[Title]`)、日期范围(`2024[pdat]`)。
|
||
|
||
```bash
|
||
python3 scripts/pubmed_search.py <query> [选项]
|
||
```
|
||
|
||
| 参数 | 说明 | 默认值 |
|
||
|------|------|--------|
|
||
| `query` | 搜索关键词,支持 PubMed 查询语法 | — |
|
||
| `--limit`, `-n` | 返回结果数量 | 10 |
|
||
| `--api-key` | NCBI API Key(可选,限额从 3 req/s 升至 10 req/s) | — |
|
||
|
||
```bash
|
||
python3 scripts/pubmed_search.py "CRISPR gene editing" --limit 5
|
||
python3 scripts/pubmed_search.py "Alzheimer[Title] AND treatment[Title]" --limit 5
|
||
```
|
||
|
||
**输出字段**:`title`, `url`, `snippet`(结构化摘要), `authors`, `pmid`, `pmc_id`(有值则可传入 `pmc_paper.py`), `pmc_url`, `journal`, `pub_date`, `volume`, `issue`, `pages`, `keywords`, `pub_types`, `doi`
|
||
|
||
### pmc_paper.py
|
||
|
||
读取 PubMed Central 开放获取全文(约 700 万篇生医论文,占 PubMed 约 35%)。`pubmed_search.py` 结果中 `pmc_id` 为 `null` 的论文无法使用本工具。
|
||
|
||
```bash
|
||
python3 scripts/pmc_paper.py <pmc_id> [--section SECTION_NAME]
|
||
python3 scripts/pmc_paper.py --pmid <pmid> [--section SECTION_NAME]
|
||
```
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| `pmc_id` | PMC ID(如 `PMC11119143` 或 `11119143`) |
|
||
| `--pmid` | PubMed ID,自动转换为 PMC ID(与 `pmc_id` 二选一) |
|
||
| `--section`, `-s` | 章节名(大小写不敏感,支持部分匹配)。不指定则列出所有章节。 |
|
||
| `--api-key` | NCBI API Key(可选) |
|
||
|
||
```bash
|
||
python3 scripts/pmc_paper.py PMC11119143 # 列出章节
|
||
python3 scripts/pmc_paper.py PMC11119143 --section introduction
|
||
python3 scripts/pmc_paper.py --pmid 38786024 --section conclusion
|
||
```
|
||
|
||
**列出章节输出字段**:`pmc_id`, `pmid`, `title`, `pmc_url`, `section_count`, `sections[]`(name, level,含子章节层级)
|
||
|
||
**读取章节输出字段**:`pmc_id`, `section`, `level`, `content`(含子章节文本), `char_count`
|
||
|
||
### wikipedia_search.py
|
||
|
||
```bash
|
||
python3 scripts/wikipedia_search.py <query> [选项]
|
||
```
|
||
|
||
| 参数 | 说明 | 默认值 |
|
||
|------|------|--------|
|
||
| `query` | 搜索关键词(必填) | — |
|
||
| `--limit`, `-n` | 返回结果数量 | 10 |
|
||
| `--lang`, `-l` | 语言版本(`en`, `zh`, `ja`, `de`, `fr` 等) | en |
|
||
|
||
```bash
|
||
python3 scripts/wikipedia_search.py "machine learning" --limit 5
|
||
python3 scripts/wikipedia_search.py "深度学习" --lang zh --limit 5
|
||
```
|
||
|
||
## 全文阅读工作流
|
||
|
||
搜索脚本返回摘要,阅读脚本返回正文。两者配合可按需精读,节省 token。
|
||
|
||
**ArXiv 论文**:
|
||
1. `arxiv_search.py` 搜索 → 获取 `arxiv_id`
|
||
2. `arxiv_paper.py <id>` 列章节 → `arxiv_paper.py <id> --section introduction` 快速判断是否深入
|
||
3. 按需读取 `method` / `experiment` / `conclusion`
|
||
|
||
**PMC 生医论文**:
|
||
1. `pubmed_search.py` 搜索 → 结果中取 `pmc_id`(非 null 才有全文)
|
||
2. `pmc_paper.py <pmc_id>` 列章节 → 按需读取关键章节
|
||
|
||
## 引用追溯工作流
|
||
|
||
通过论文的引用关系发现关键词搜索覆盖不到的相关工作。
|
||
|
||
**Backward(找奠基工作)**:
|
||
1. 关键词搜索找到高相关论文 → 取其 `paper_id` 或 `arxiv_id`
|
||
2. `semantic_scholar_refs.py <id> references --min-citations 50` → 找到高引参考文献
|
||
3. 筛选与研究问题相关的条目 → 用 `arxiv_paper.py` 或 `pmc_paper.py` 深入阅读
|
||
|
||
**Forward(找后续进展)**:
|
||
1. 找到领域奠基论文或关键论文 → 取其 ID
|
||
2. `semantic_scholar_refs.py <id> citations --year-min 2024 --min-citations 10` → 找到近期高引跟进工作
|
||
3. 筛选与研究问题相关的条目 → 深入阅读
|
||
|
||
**Citation Chain(追溯演化路径)**:
|
||
1. 从种子论文 A 出发 → backward 找到 A 的关键参考文献 B
|
||
2. 从 B 出发 → forward 找到引用 B 的后续工作(可能发现 A 没引用的相关论文 C)
|
||
3. 形成 B → A → ... 和 B → C → ... 的知识脉络
|
||
|
||
## ArXiv 分类速查
|
||
|
||
顶层领域可直接用(如 `--category cs`),子分类更精确(如 `--category cs.AI`)。
|
||
|
||
| 领域 | 分类代码 | 说明 |
|
||
|------|---------|------|
|
||
| **计算机科学** | `cs.AI` | 人工智能 |
|
||
| | `cs.LG` | 机器学习 |
|
||
| | `cs.CL` | 计算语言学 / NLP |
|
||
| | `cs.CV` | 计算机视觉 |
|
||
| | `cs.IR` | 信息检索 |
|
||
| | `cs.RO` | 机器人 |
|
||
| | `cs.SE` | 软件工程 |
|
||
| | `cs.DC` | 分布式/并行计算 |
|
||
| | `cs.NI` | 网络与互联网 |
|
||
| | `cs.CR` | 密码学与安全 |
|
||
| | `cs.DB` | 数据库 |
|
||
| | `cs.HC` | 人机交互 |
|
||
| **统计** | `stat.ML` | 统计机器学习 |
|
||
| | `stat.AP` | 应用统计 |
|
||
| | `stat.ME` | 统计方法论 |
|
||
| **数学** | `math.OC` | 优化与控制 |
|
||
| | `math.ST` | 统计理论 |
|
||
| | `math.CO` | 组合数学 |
|
||
| **物理** | `physics` | 物理(全类) |
|
||
| | `cond-mat` | 凝聚态物理 |
|
||
| | `quant-ph` | 量子物理 |
|
||
| | `hep-th` | 高能理论物理 |
|
||
| **经济/金融** | `econ.GN` | 经济学综合 |
|
||
| | `q-fin.CP` | 计算金融 |
|
||
| | `q-fin.ST` | 统计金融 |
|
||
| **生物/医学** | `q-bio.NC` | 神经科学 |
|
||
| | `q-bio.GN` | 基因组学 |
|
||
| | `q-bio.QM` | 定量方法 |
|
||
|
||
## 输出格式
|
||
|
||
所有脚本输出标准 JSON:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"query": "...",
|
||
"provider": "arxiv|semantic_scholar|pubmed|wikipedia",
|
||
"items": [{"title": "...", "url": "...", "snippet": "...", ...}],
|
||
"error": null
|
||
}
|
||
```
|
||
|
||
`arxiv_paper.py` 和 `pmc_paper.py` 不走 `items` 格式,直接返回结构化对象(见各自"输出字段"说明)。
|