0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BiblioFetch.jl で論文 1 本から citation graph を辿って関連 PDF も全部回収する

0
Last updated at Posted at 2026-05-05

はじめに

レビュー論文を 1 本見つけたとき、「この paper が引いている文献も全部手元に欲しい」と思うことが頻繁にあります。1 本ずつ DOI をコピペして取るのは現実的でなく、Connected Papers のようなビジュアル系サービスは PDF を実際にダウンロードしてくれません。

BiblioFetch.jl には citation graph 自動展開 があります。seed 論文の DOI を 1 つ与えると、引用文献を Crossref と Semantic Scholar から取得し、それぞれの PDF も同じバッチで回収して、subgraph を git 管理可能な形で残します。

どう動くか

1 hop 展開の流れ:

[seed paper]
    ↓ Crossref で reference list 取得
    ↓ Semantic Scholar で reference list を補完
[seed の引用文献 N 本]
    ↓ 各 DOI を fetch_paper! で並列 fetch
[N 本の PDF + メタデータ]
    ↓ referenced_by フィールドで親子関係を記録
[citation subgraph]

各ステップで取れた DOI / arXiv id は store の .metadata/<safekey>.toml に referenced_dois と referenced_by として残るので、後から再構築可能です。

実例:Schollwöck の MPS/DMRG レビュー

examples/citation-graph-job.toml:

[folder]
target = "graph_papers"

[fetch]
sources = ["unpaywall", "arxiv", "s2", "direct"]

[graph]
follow_references = true
max_depth = 1
max_refs_per_paper = 20

[doi]
list = [
    "10.1016/j.aop.2010.09.012",       # Schollwöck 2011 MPS review
]

走らせる:

$ bibliofetch run examples/citation-graph-job.toml

実行ログ:

✓ 10.1016/j.aop.2010.09.012  [unpaywall]  → graph_papers/...
expand  depth=1  new_refs=20  from_parents=1
✓ 10.1103/physrevlett.69.2863  [arxiv]    → graph_papers/...
✓ 10.1103/physrevb.48.10345    [unpaywall]  → ...
...

max_refs_per_paper = 20 で fan-out を制限しています。レビュー論文は 200+ 引用が普通なので、無制限にすると爆発します。

subgraph の可視化

走り終わったら mermaid または DOT で出力:

$ bibliofetch graph --format mermaid --out graph.mmd graph_papers

mermaid 出力例(一部):

DOT 形式なら Graphviz でレンダリング:

$ bibliofetch graph --format dot --out graph.dot graph_papers
$ dot -Tpng graph.dot -o graph.png

Semantic Scholar が citation graph を補強する理由

sources = [..., "s2", ...] を入れている理由は Crossref に reference list が無い場合の補完です。具体的には:

  • arXiv-only な preprint — Crossref に登録されていないので reference list も取れない
  • 古い論文 — Crossref の reference deposit が普及前
  • 一部の小規模出版社 — reference list を Crossref に送っていない

これらを Semantic Scholar の API でカバーすると、subgraph の edge density が体感で 1.5–2 倍になります。

max_depth の使い分け

max_depth 規模 用途
1 (default) seed + 直接引用 レビュー論文の周辺把握
2 seed + 引用 + 引用の引用 分野全体の見渡し(数百本)
3+ 指数爆発 通常は不要

max_depth = 2 で max_refs_per_paper = 20 を組むと、20 + 20×20 = 420 本程度。これくらいが論文 1 本書く準備の上限です。

集めた後の活用

# BibTeX 出力(FirstAuthorYear 形式の citekey)
$ bibliofetch bib graph_papers
wrote 21 entries → graph_papers/graph_papers.bib

# 集めた中で「entanglement」を含む論文を grep
$ bibliofetch search graph_papers entanglement

# 重複検出(同じ paper が異なる DOI alias で入った場合)
$ bibliofetch dedup graph_papers

注意点

  • rate limit:Crossref / Unpaywall は polite pool でも秒数本程度。Semantic Scholar は API key 無しで 1 req/s。parallel = 4 程度から先は逆効果
  • ネットワーク fluctuation:fetch に失敗したものは status = "pending" で残るので、bibliofetch sync で後から retry できる
  • fan-out 暴発:max_refs_per_paper は強制しているが、max_depth = 2 以上は事前見積もりを

まとめ

BiblioFetch.jl の citation graph 機能は、「1 本のレビューから周辺文献を取り尽くす」研究 workflow を 1 ファイルの TOML に凝縮します。Crossref + S2 のハイブリッドで edge を稠密にし、subgraph は mermaid / DOT で見える化、BibTeX も同時に出力。git 管理可能な subgraph リポジトリを 1 コマンドで作る感覚です。


関連記事:

GitHub: sotashimozono/BiblioFetch.jl


免責事項
この記事のコードは MIT License に基づき自由に利用できます。
ただし記事本文の著作権はすべて筆者に帰属し、無断転載・再利用を禁じます。
記事の内容は執筆時点のものであり、正確性・完全性を保証しません。
本記事の利用によって生じたいかなる損害についても筆者は責任を負いません。

この記事は SyncLore を使って管理しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?