literature-review について
システマティックレビューや計量書誌分析に取り組む研究者向けのスキルです。検索結果、全文、引用、主張を検証するスクリプトで、根拠に基づくレビュー作成を支援します。
主な機能
- 01分野横断的な文献検索
- 02文献の重複排除とコーパス構築
- 03全文取得とソース検証
- 04引用と撤回状態の確認
- 05主張と引用の対応確認
- 06PRISMA 2020フロー件数の算出
活用シーン
- 01テーマに沿ったコーパスの構築と選別
- 02参考文献の識別子とタイトルの確認
- 03引用の追跡とオープン全文の取得
- 04レビューの主張をソースと照合
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ poemswe/ co-researcher --skill literature-reviewインストール後、Claude Code で/literature-reviewを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/arxiv/query_syntax.mdreferences/openalex/authors.mdgeo_and_language.mdinstitutions.mdpublishers_funders.mdsources.mdtaxonomy.mdtopics.mdtype_values.mdworks.mdscripts/build_corpus.pycheck_claims.pyeuropepmc_api.pyhttp_client.pyimport_library.pyjats.pylibrary_sources.pyopenalex_cli.pyprisma_counts.pyread_paper.pysearch_arxiv.pyvalidate_review.pyverify_citations.pyscripts/review_integrity/__init__.pymodels.pyrepair.pyreporting.pyscoring.pyvalidators.pyworkspace.py詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
<search_backend>
このスキルには、scripts/ 内のコマンドライン検索バックエンドが含まれています。これらは独立したスキルではありません。scripts/ 内にある共通の http_client および jats ヘルパーモジュールによって、レート制限と再試行が自動的に処理されます。
呼び出しとワークスペース(最初にお読みください): 各スクリプトは、このスキルのベースディレクトリ(上記に「Base directory for this skill」として表示)配下の絶対パスを指定して呼び出してください。例:uv run <skill-dir>/scripts/openalex_cli.py …。スキルディレクトリには絶対に cd しないでください。 ユーザーがスキルを呼び出したディレクトリにとどまり、ステップ1で WS="$(pwd)/review/{slug}" を一度計算して、すべての箇所で --workspace に $WS を渡し、そこでレビュー用ワークスペースを作成してください。相対パスの review/{slug} は誤ったディレクトリを基準に解決され、インストール済みプラグインを汚染します。以下のコマンド例では、scripts/… は <skill-dir>/scripts/… の略記です。
前提条件:
uvがインストールされている必要があります。uv --versionで確認してください。インストールされていない場合は、プラグインのセットアップスクリプトを一度実行してください:bash <plugin-root>/scripts/setup.sh。セットアップスクリプトはuvをインストールし、OpenAlex API キーの入力を(任意で)求め、依存関係のキャッシュを準備します。セットアップを実行できない場合の代替手段:curl -LsSf https://astral.sh/uv/install.sh | sh && export PATH="$HOME/.local/bin:$PATH"。OPENALEX_API_KEY(任意、推奨)。設定しない場合、OpenAlex は未認証のポライトプールを使用します。1日あたりの予算は $0.01 で、スロットリングが発生するまでにfilterクエリは約10回、--searchは1日1回実行できます。無料のキーを設定すると、1日あたりの予算は $1 になり、約10 req/s で利用できます。キーは~/.envに保存されます。決して~/.envを読んだり、表示、cat、echoしたり、その他の方法で調べたりしないでください。認証情報をエージェントのコンテキストに入れてはいけません。キーを漏らさずに追加する必要がある場合は、ユーザーに次のコマンドを提示してください:printf "Enter OpenAlex API key (hidden): " && read -s k && echo && printf "OPENALEX_API_KEY=%s\n" "$k" >> ~/.env && unset k && echo "Saved."。
1. OpenAlex — scripts/openalex_cli.py(分野横断型、約2億5,000万件の著作物)
幅広い検索のデフォルトとして使用してください。全リファレンスは references/openalex/works.md、authors.md、topics.md などを参照してください。
uv run scripts/openalex_cli.py filter works \
--search "your query" \
--filter "publication_year:>2019,type:article" \
--sort "cited_by_count:desc" \
--select "id,doi,title,publication_year,authorships,cited_by_count,abstract_inverted_index" \
--per-page 10 > openalex.json
--search のみを使うと、トピックと無関係なノイズが上位に表示されます(トピックから外れた生成 AI の論文が上位に来ます)。焦点を絞ったコーパスを作成するには、概念/トピックのフィルターを優先してください。references/openalex/topics.md でトピックを特定し、--filter "topics.id:T<id>"(または concepts.id:C<id>)で絞り込んだうえで、その範囲内の順位付けにのみ --search を使います。生の --search と --sort "cited_by_count:desc" を組み合わせてはいけません。関連性ではなく知名度で順位付けされ、キーワードが含まれているだけの代表的な論文で検索結果が埋まってしまいます。この方法で「large language model abstract screening」を検索すると、WGCNA R パッケージ、PRISMA Statement、Rayyan が返されます。ソートを外すと、実際の LLM によるスクリーニングの論文が表示されます。引用数でソートするのは、すでにトピックフィルターで絞り込んだ場合に限ってください。スクリプトには合計の hitCount/結果数が表示されます。これをクエリのヒット数として記録してください。
</search_backend>
2. arXiv — scripts/search_arxiv.py(プレプリント:CS、物理学、数学、量的生物学、統計学)
ごく最近の研究、ML/CS のトピック、物理学に使用します。クエリ構文:references/arxiv/query_syntax.md。
uv run scripts/search_arxiv.py \
--query "ti:\"your phrase\" AND cat:cs.LG" \
--sort_by relevance \
--max_results 10 > arxiv.json
レビューでは、既定で relevance を使用します。基礎的な研究が表示されます。最新のプレプリントだけを特に求める場合に限り、--sort_by submittedDate --sort_order descending を使用してください。日付順の並べ替えでは直近 1 か月の論文に偏り、重要な先駆的論文が漏れるためです。results_count フィールドを含む JSON オブジェクトを 1 つ出力します。これをヒット件数として記録してください。
3. Europe PMC — scripts/europepmc_api.py(生命科学のオープンアクセス全文+引用グラフ)
生物医学のトピック、全文の取得、前方/後方の引用をたどる場合に使用します。
uv run scripts/europepmc_api.py search "your query AND HAS_FT:y" \
--sort "CITED desc" --max_results 10 --output europmc.json
uv run scripts/europepmc_api.py get_citations MED <PMID> --output citing.json
uv run scripts/europepmc_api.py get_references MED <PMID> --output refs.json
uv run scripts/europepmc_api.py get_fulltext <PMCID> --output fulltext.txt
4. 全文の取得 — scripts/read_paper.py(任意の識別子 → Markdown)
論文ごとに 1 回呼び出します。最適な合法的オープンアクセス経路を自動的に解決します。
uv run scripts/read_paper.py --doi 10.1038/s41586-021-03819-2 --workspace "$WS"
uv run scripts/read_paper.py --arxiv 1706.03762 --workspace "$WS"
uv run scripts/read_paper.py --pmcid PMC8371605 --workspace "$WS"
($WS は手順 1 で指定した絶対パスのワークスペース($(pwd)/review/{slug})です。相対パスは決して渡さないでください。)JSON を 1 行出力します:{"status": "fulltext|abstract-only", "path": ..., "source": ..., "id": ...}。ファイルは $WS/papers/{id}/(paper.pdf、fulltext.md または abstract.md)に保存されます。ユーザーが $WS/papers/{id}/paper.pdf に置いた PDF は、ネットワークへのアクセスより先に取得されます。ペイウォールのある論文は abstract-only を返します。決してスクレイピングしないでください。
5. コーパスの構築 — scripts/build_corpus.py(バックエンドの生 JSON → 正規化・重複排除済みの corpus.json)
uv run scripts/build_corpus.py --openalex "$WS/openalex.json" \
--arxiv "$WS/arxiv.json" --epmc "$WS/epmc.json" --output "$WS/corpus.json"
各フラグは繰り返し指定できます。複数のバックエンドで見つかった論文は、found_via を結合した 1 つのレコード(openalex+epmc)に統合されます。既存の corpus.json に対して再実行すると、新しい論文だけが追加されます。既存レコードのスクリーニング判定、fulltext、role は変更されないため、後続の検索ラウンドやスノーボールサンプリングで過去の成果が失われることはありません。
6. 引用の検証 — scripts/verify_citations.py(参考文献一覧 → 検証済み/不一致/未検出/撤回済み)
uv run scripts/verify_citations.py --input "$WS/refs.json"
入力:JSON 配列([{"doi", "title"}] または引用情報の文字列のみ)、BibTeX(.bib)、または 1 行に 1 件の引用を記載したテキスト/Markdown ファイル(DOI は自動抽出)。各引用を OpenAlex で解決し、DOI については Europe PMC で照合してから、Crossref の Retraction Watch データを使って、クリーンな DOI をすべてクロスチェックします(OpenAlex 自体の撤回フラグでは、撤回済みの論文を見落とすことがあります)。Crossref の高速な polite pool を使用するには、CO_RESEARCHER_USER_AGENT="your-tool (mailto:[email protected])" を設定してください。撤回の確認は段階的に行われます。まず OpenAlex、次に DOI がある場合は Crossref、最後に DOI がない場合(または Crossref で確認できない場合)は論文の PubMed レコードを確認します。すべての結果に retraction_checked と retraction_source が含まれます。確認を実行できなかった場合は未確認として報告され、問題なしとは扱われません。JSON レポートを出力し、すべての引用が検証された場合のみ終了コード 0 を返します。提示前に、すべての参考文献一覧で実行してください。mismatched は DOI が存在するものの、記載されたタイトルと一致しないこと(典型的な捏造パターン)を意味し、retracted は論文は存在するものの撤回されていることを意味します。出力前にどちらも修正するか削除してください。
7. PRISMA 件数 — scripts/prisma_counts.py(corpus.json → PRISMA 2020 のフロー件数)
uv run scripts/prisma_counts.py --corpus "$WS/corpus.json"
ソース別、重複排除後、スクリーニング済み、理由別の除外、採用、取得不可、統合対象の各レコード数を報告します。除外レコードに理由が記載されていない場合は、終了コード 1 で終了します。systematic-review で使用されます。どのようなレビューでも、コーパスの記録が実態と一致しているかを確認するのに役立ちます。
バックエンドの選び方:
- 分野横断的な概要、引用数、著者/機関のメタデータ → OpenAlex
- CS/ML/物理学の最先端プレプリント → arXiv
- 生命科学、医学、全文、引用をたどる場合 → Europe PMC
幅広いレビューでは、3 つすべてを並行して実行し、手順 3 で DOI による重複排除を行います。
</search_backend>
すべての状態はレビュー用ワークスペース review/{slug}/ に保存します。内容は protocol.md(質問、基準、クエリログ)、corpus.json(候補プールとスクリーニングの判定)、papers/{id}/(全文とメモ)、synthesis.md です。ステップ1で作成してください。セッションを再開した場合は、まず corpus.json を読み、スクリーニングを中断した箇所から再開してください。
- 範囲の設定 — 調査の質問と厳格な採用・除外基準を
protocol.mdに記載します。基準についてユーザーの承認を得るまで作業を中断してください。範囲設定のための検索によって質問を修正する場合は、変更履歴を追記し、上書きしないでください。 - 検索 — バックエンドを実行します。すべてのクエリを実行日とヒット件数とともに、原文のまま
protocol.mdに記録してください。未加工の JSON はワークスペースに保存し、全件をまとめてコンテキストに読み込まないでください。 - 重複の除去とプールの作成 — 未加工のバックエンドファイルに対して
build_corpus.pyを実行してください。手動で統合しないでください。バックエンド間の重複を除去したうえで、論文ごとに1件のレコードを出力します。各レコードの内容はkey(正規化した DOI、なければ正規化したタイトル、さらにそれもなければソース識別子)、ids、title、year、cited_by(いずれかのバックエンドが報告した最高値)、found_via、screening: {status, stage, reason}、fulltext、roleです。後の検索ラウンド後に再実行した場合も、すでに行ったすべてのスクリーニング判定が保持されます。
uv run scripts/build_corpus.py --openalex "$WS/openalex.json" \
--arxiv "$WS/arxiv.json" --epmc "$WS/epmc.json" --output "$WS/corpus.json"
- タイトル・要旨のスクリーニング — レコードごとに
screening.status(included/excluded)とreasonを設定します。除外理由は必須です。プールが約50件を超える場合は、まず約20件をランダムに選んでパイロットスクリーニングを行い、一括スクリーニングに進む前に、判定が難しいものをユーザーに提示してください。 - 論文の取得と精読 — 採用した論文ごとに
read_paper.pyを実行します。スクリプトのstatus値(fulltextまたはabstract-only)を、その論文のcorpus.json内のfulltextフィールドに直ちに書き込んでください。prisma_counts.pyはこのフィールドを読み取ってnot_retrievedとin_synthesisを算出します。nullのままのレコードは取得できなかったものとして数えられます。各論文をevidence(質問に直接関係するエビデンス)またはbackgroundに分類します。エビデンス論文については、全文をもとにnotes.mdを作成する必要があります。fulltext.mdの本文を Read/Grep で実際に読み、方法と結果を確認してください。全文を一度にコンテキストに読み込むのは必ず1論文だけとし、複数の全文を同時に読み込まないでください。背景論文は要旨レベルで引用してかまいません。notes.mdの形式は、引用情報、精読の深さ、研究デザイン、N、主要な効果、質問に関連する主張(セクションのアンカー付き)、限界、テーマタグです。抽出された表をそのまま信頼しないでください。複数列の表は断片化して順序が崩れた行として出力されるため、表形式のデータを使う場合は元の PDF を読み直してください。fulltext.mdのナビゲーション方法はルートによって異なります。これはスクリプトの JSON 行にあるsourceフィールドで指定されます。source: "epmc"(JATS)では実際の Markdown 見出しが生成されるため、grep -n "^#"でセクションを探します。すべての PDF ルート(arxiv_pdf、oa_pdf、user_pdf、cached)では、#見出しはまったく生成されません。セクションタイトルは太字の行として表示されるため、代わりにgrep -n "^\*\*"を使います。PDF ルートの論文でgrep "^#"の結果が何も返されなくても、文書に構造がないのではなく、パターンが間違っています。どちらのパターンでも必要なセクションが見つからない場合は、セクションアンカーではなく内容を引用してください。 - スノーボール — 中核となるエビデンス論文について、
get_references/get_citations(Europe PMC)を実行するか、OpenAlex のreferenced_worksをたどります。新たな候補を同じcorpus.jsonに取り込み、build_corpus.py --epmc citing.json --found-via snowball:citations --output "$WS/corpus.json"を実行します(新規分のみ追加され、由来がタグ付けされ、すでに行われた判定は保持されます)。その後、ステップ 4 で候補をスクリーニングします。デフォルトでは 1 ラウンド実施し、追加される論文がなくなったら終了します。採用した論文から、当初の検索で見落とした用語が見つかった場合は、検索条件を調整してもう 1 ラウンド実施し、その記録を残します。 - 統合 —
notes.mdファイルのみからsynthesis.mdを作成します。fulltextがabstract-onlyの引用には、文中に[abstract-only]を付けます。最後に、取得できなかった論文と、ユーザーが合法的に入手した PDF を置いて再実行できるpapers/{id}/paper.pdfのパスを列挙した取得サマリーを記載します。 - 参考文献を検証 — 最終的な引用リストを
$WS/refs.jsonに書き込み、verify_citations.py --input "$WS/refs.json"を実行します。提示する前に終了コード 0 が必須です。mismatched/not_foundの項目があれば修正または削除します。corpus.jsonを通じてスクリーニングされた論文は検証に合格します。このゲートでは、コーパスではなく記憶を頼りに統合文書へ含められた引用を検出します。
<output_format>
文献レビュー:[トピック]
研究課題:[明記された課題] 採用基準:[対象集団/手法/日付/言語] 実施した検索:
- OpenAlex:
<正確なクエリ>→ N 件 - arXiv:
<正確なクエリ>→ N 件 - Europe PMC:
<正確なクエリ>→ N 件
テーマ別統合:
- [テーマ 1]:[検証済みの引用を含む要約]
- [テーマ 2]:[検証済みの引用を含む要約]
研究ギャップ:
- [不在を示すエビデンスを伴うギャップ]
- [不在を示すエビデンスを伴うギャップ]
注釈付き参考文献:
- [DOI/arXiv ID/PMID を含む完全な引用] — [主な貢献と品質に関する注記]
取得サマリー:[全文 N 件/抄録のみ N 件。未取得 PDF の配置先パス] </output_format>
ユーザーに確認を求めるのは、次の場合に限ります。(1)スコープ終了時 — 基準の承認、(2)パイロットスクリーニング時 — 境界的な判定、(3)統合の前 — 採用論文数が予想外に多い(>40)または少ない(<3)場合。それ以外は、自律的に選定プロセスを進めてください。