医学研究における参考文献探しを効率化するツールです。起点となる論文から、PubMedのSimilar Articles、Cited by、Referencesを自動的に辿り、Gemini AIを使って研究テーマとの関連性を評価しながら、関連論文を収集します。
- 自動探索: 起点論文(PMID / URL / DOI)から関連論文を再帰的に探索
- DOI対応: PMIDがない論文もDOIで識別・管理可能
- AI評価: Gemini APIで各論文との関連性を0-100のスコアで評価
- スマートフィルタリング: 関連性が低い論文は次階層の探索から除外
- 論文数制限: 1論文あたりの最大関連論文数を制限可能(探索数の爆発を防止)
- 年代フィルタ: 特定の年以降の論文のみに絞り込み可能
- 一時中断・再開機能:
- 検索中に「⏸️ 評価を停止」ボタンで途中停止可能
- 検索状態が自動保存され、次回同じプロジェクトで再開可能
- 評価済み論文は自動的にスキップされ、効率的に続きから探索
- 堅牢なエラーハンドリング:
- Gemini API TPM制限時の自動リトライ(60秒/120秒/180秒待機)
- 評価後の即座保存で進捗保護(最大1件のデータ損失に抑制)
- Notion API タイムアウトへのリトライ処理(30秒/60秒/90秒待機)
- キャッシュ機能: 評価済み論文を自動保存し、重複評価を防止(API コスト削減)
- 検索の再開・追加: 既存プロジェクトに新しい起点から論文を追加可能
- 「この論文を起点に検索」ボタンで、プロジェクト内論文から即座に検索開始
- 論文削除: 不要な論文や評価失敗した論文を削除して再評価可能
- 検索セッション管理: 各検索を自動的に記録し、フィルタで絞り込み可能
- 同日に複数回検索しても、各検索セッションで絞り込み可能
- 過去の検索セッションも選択可能(日時と件数を表示)
- 複数のセッションで発見された論文は、すべてのセッションに表示される
- フィルタ&エクスポート: 検索なしでプロジェクト内論文をフィルタリング・エクスポート可能
- 検索セッション、Notion登録状態、スコアで絞り込み
- 評価日時を論文詳細に表示
- ソース追跡: 各論文がどの論文のSimilar/Cited by/Referencesから発見されたかを記録
- WebベースGUI: Streamlitによる使いやすいインターフェース
- スライダー + 数値入力: すべてのパラメータで直接数値入力可能(双方向連動)
- リアルタイムフィルタ: 検索結果画面でフィルタを変更しても結果が保持される
- ページネーション: 100件ずつ表示して大量の論文でもスムーズに閲覧可能
- スコア分布表示: プロジェクト内論文のスコア分布を視覚的に把握
- ネットワークグラフ可視化:
- st-link-analysis (Cytoscape.js) によるインタラクティブな論文ネットワークの可視化
- ノードサイズ = 被リンク数(20-120px、関連論文が多いほど大きく表示)
- ノードの色 = 関連性スコア(5段階:赤=EXCELLENT 81-100点、オレンジ=GOOD 61-80点、黄=MODERATE 41-60点、薄青=FAIR 21-40点、濃青=POOR 1-20点)
- 調整可能なレイアウト: ノード間の距離、反発力、重力を最適化
- ノードダブルクリック: 論文リストの該当論文詳細に直接ジャンプ
- 矢印で親子関係を表示(親論文 → 子論文)
- 「最小被リンク数」フィルタで重要論文に絞り込み可能
- ホバーで論文詳細を表示
- 注意: 論文数が増えると生成に時間がかかります(1000件以上で数十秒〜数分)
- セマンティック・マップ可視化:
- Gemini Embeddings API(
embedding-001)を使用したアブストラクトのベクトル化 - UMAPによる2次元圧縮で意味的類似性を空間配置
- Hidden Gemsの発見: 引用関係が少なくても内容が類似した論文を発見
- バッチ処理(100件ずつ)で高速化、進捗バーで待機ストレス軽減
- ベクトルデータのキャッシュで再計算不要
- ポイントクリック: 論文リストの該当論文詳細に直接ジャンプ
- 点の色 = 関連性スコア(赤=高、黄=中、青=低)
- 点の大きさ = 被リンク数(重要なハブ論文)
- インタラクティブなPlotly散布図
- 注意: Embedding APIの使用には有料tierのAPIキーが必要(無料枠内で計算可能な場合がほとんど)
- Gemini Embeddings API(
- API Key管理: 無効なAPI Keyを検出し、GUIから.envに保存可能
- JSON出力: 収集した論文データをJSON形式でエクスポート
- Notion連携: Notionデータベースとの連携
- 論文の登録状態を自動チェック
- 検索後は新規評価された論文のみをチェック(効率的)
- プロジェクトごとのスコア管理: 同じ論文でもプロジェクトごとに異なるスコアを記録
Project Scoresフィールドに全プロジェクトのスコア履歴を保存Scoreフィールドには最高スコアを自動設定
- Notionページへ直接リンク
- Notion未登録論文のみ表示するフィルタ
- 連携情報の永続化(再読み込み時も反映)
- 機関別リンク設定: 所属機関の電子ジャーナルプロキシやArticle Linkerを設定可能(主要大学の設定例あり)
CLIに慣れていない方は、こちらの方法を推奨します!
- Python 3.8以上をインストール(ダウンロード)
setup.commandをダブルクリック- 完了したら
.envファイルを開いて Gemini API Key を設定 run.commandをダブルクリックしてアプリ起動
- Python 3.8以上をインストール(ダウンロード)
- インストール時に 「Add Python to PATH」にチェック を入れる
setup.batをダブルクリック- 完了したら
.envファイルを開いて Gemini API Key を設定 run.batをダブルクリックしてアプリ起動
- Python 3.8以上
- Gemini API Key(無料で取得可能)
# リポジトリをクローン(または手動でダウンロード)
cd AriticleFinder
# 依存パッケージをインストール
pip install -r requirements.txtGemini API Keyを取得してください: https://makersuite.google.com/app/apikey
方法1: 環境変数に設定(推奨)
# .envファイルを作成
cp .env.example .env
# .envファイルを編集してAPI Keyを設定
# GEMINI_API_KEY=your_api_key_here方法2: GUIで直接入力
起動後、サイドバーのAPI設定欄にAPI Keyを入力し、「💾 API Keyを.envに保存」ボタンで保存できます
Notionデータベースと連携する場合:
- Notion APIキーを取得: https://www.notion.so/my-integrations
- データベースIDを取得(データベースURLの
workspace/の後の文字列) .envファイルに追加:
NOTION_API_KEY=your_notion_api_key_here
NOTION_DATABASE_ID=your_database_id_hereまたは、アプリ起動後にサイドバーの「Notion連携」セクションで設定可能です。
必要なNotionデータベースのプロパティ:
PubMed: URL型(論文のPubMed URLを保存)Score: 数値型(最高スコアを保存)Project Scores: テキスト型(プロジェクトごとのスコア履歴を保存)- 形式例:
プロジェクトA: 60点 (2024-01-15)
- 形式例:
OpenAlex APIを使ってReferences(引用文献)を取得します。メールアドレスを設定することで、検索速度が10倍向上します。
# .envファイルに追加
OPENALEX_EMAIL=your_email@example.com設定のメリット:
- メールアドレス設定なし: 1リクエスト/秒
- メールアドレス設定あり: 10リクエスト/秒(Polite pool)
所属機関の電子ジャーナルアクセスやArticle Linkerを利用する場合に設定します。
設定方法:
- アプリ起動後、サイドバーの「機関別リンク設定」を開く
- 以下のテンプレートを入力(
{doi}や{pmid}が自動置換されます)- DOIプロキシURL テンプレート: 機関のプロキシ経由でDOIにアクセス
- 図書館リンクURL テンプレート: 機関のArticle Linkerにアクセス
主要大学の設定例:
🎓 東京大学
DOIプロキシURL テンプレート:
https://doi-org.utokyo.idm.oclc.org/{doi}
図書館リンクURL テンプレート:
https://vs2ga4mq9g.search.serialssolutions.com/?sid=Entrez:PubMed&id=doi:{doi}
🎓 京都大学
DOIプロキシURL テンプレート:
https://doi-org.kyoto-u.idm.oclc.org/{doi}
図書館リンクURL テンプレート:
https://tt2mx4dc7s.search.serialssolutions.com/?sid=Entrez:PubMed&id=doi:{doi}
🎓 大阪大学
DOIプロキシURL テンプレート:
https://doi-org.osaka-u.idm.oclc.org/{doi}
図書館リンクURL テンプレート:
(各自の所属図書館にご確認ください)
🎓 東北大学
DOIプロキシURL テンプレート:
https://doi-org.tohoku.idm.oclc.org/{doi}
図書館リンクURL テンプレート:
(各自の所属図書館にご確認ください)
🎓 北海道大学
DOIプロキシURL テンプレート:
https://doi-org.hokudai.idm.oclc.org/{doi}
図書館リンクURL テンプレート:
(各自の所属図書館にご確認ください)
🎓 九州大学
DOIプロキシURL テンプレート:
https://doi-org.kyushu-u.idm.oclc.org/{doi}
図書館リンクURL テンプレート:
(各自の所属図書館にご確認ください)
🎓 名古屋大学
DOIプロキシURL テンプレート:
https://doi-org.nagoya-u.idm.oclc.org/{doi}
図書館リンクURL テンプレート:
(各自の所属図書館にご確認ください)
注意事項:
- DOIプロキシURLは多くの大学で
https://doi-org.[大学コード].idm.oclc.org/{doi}の形式です - 上記以外の大学の場合、所属機関の図書館システムにお問い合わせください
- Article LinkerのURLは機関によって異なるため、図書館にご確認ください
- 設定は
user_settings.jsonに保存され、次回起動時も維持されます - 空欄の場合は通常のDOIリンクが表示されます
- Mac:
run.commandをダブルクリック - Windows:
run.batをダブルクリック
ブラウザが自動的に開きます(通常 http://localhost:8502)
streamlit run main.py --server.port 8502ブラウザが自動的に開きます(通常 http://localhost:8502)
- Gemini API Key: API Keyを入力(無効なキーは自動検出)
- Geminiモデル: 使用するGeminiモデルを選択(すべて無料枠あり)
gemma-3-27b-it(デフォルト): API制限が緩やか、推奨gemini-2.5-flash-preview-09-2025: 最新プレビュー版gemini-2.5-flash: 最新の安定版高速モデルgemini-2.5-flash-lite: 最も高速で低コストgemini-2.5-pro: 最高精度、複雑な推論に最適gemini-2.0-flash: 安定版マルチモーダルモデルgemini-2.0-flash-lite: 安定版の軽量モデル
- Notion連携を有効にする: チェックでNotion連携機能を有効化
- Notion API Key: Notion APIキーを入力
- Notion Database ID: NotionデータベースIDを入力
- 検索実行時に新規評価された論文のみ自動的にNotionデータベースをチェックし、スコアを更新
- プロジェクト:
- 新規プロジェクト作成: 新しいプロジェクトを作成
- 既存プロジェクトを開く: 既存プロジェクトを閲覧・管理、または論文を追加(重複評価を防止)
- 探索の深さ: 何階層まで関連論文を辿るか(1-5)
- スライダーまたは数値入力で設定可能
- 最大論文数: 収集する論文の最大数(10-1000、5刻み)
- デフォルト: 100
- スライダーまたは数値入力で設定可能
- 関連性スコア閾値: この値以上のスコアの論文のみ次階層を探索(0-100、5刻み)
- スライダーまたは数値入力で設定可能
各探索タイプごとに個別に設定可能:
-
Similar articles(類似論文):
- 探索する/しない(チェックボックス)
- 最大取得数(1論文あたり、5-100、5刻み、デフォルト: 20)
-
Cited by(この論文を引用している論文):
- 探索する/しない(チェックボックス)
- 最大取得数(1論文あたり、5-100、5刻み、デフォルト: 20)
-
References(この論文が引用している文献):
- 探索する/しない(チェックボックス、デフォルト: オフ)
- 最大取得数(1論文あたり、5-100、5刻み、デフォルト: 20)
- 年代フィルタ: 特定の年以降の論文のみ収集(オプション)
- 起点論文: PubMed ID、URL、またはDOI
- 例:
12345678、https://pubmed.ncbi.nlm.nih.gov/12345678/、10.1038/nature12345
- 例:
- 探したい論文の内容: どのような論文を探したいか具体的に記載
- 例: 「小児喘息患者における吸入ステロイド薬の長期使用が成長に与える影響について研究している論文を探しています。特に低用量から中用量のステロイド使用における安全性や、代替治療法との比較研究に興味があります。」
- AIがこの内容に合致する論文を評価して探します
「🚀 論文検索を開始」ボタンをクリック
検索中は「⏸️ 評価を停止」ボタンで途中停止も可能です
- 統計情報: 発見論文数、新規評価数、キャッシュ数、関連論文数、到達階層
- フィルタ:
- 関連論文のみ表示(チェックボックス)
- 新規評価のみ表示(チェックボックス) - キャッシュされた論文を除外
- Notion未登録のみ表示(チェックボックス)
- 最小スコア(スライダー + 数値入力、双方向連動)
- 最小被リンク数 (NEW) - 指定数以上参照された重要論文のみ表示
- ネットワークグラフ (NEW):
- フィルタ条件を通過した論文のネットワークを可視化
- 「大きく赤いノード」= 多くの論文から参照され、かつ関連性が高い重要論文
- 論文リスト:
- 各論文の詳細情報(PMID、著者、ジャーナル、出版年)
- 京都大学図書館Article Linkerへのリンク
- 関連性スコア、関連あり/なし、探索階層
- Notion登録状態とNotionページへのリンク
- 発見元の表示(どの論文のSimilar/Cited by/Referencesから発見されたか)
- Abstract全文
- AI評価理由
- 📝 メモ・コメント機能: 各論文に自分用のメモやコメントを追加・保存できます
- エクスポート: 全データ、フィルタ後データ、プロジェクト全体をJSON形式でダウンロード
既存プロジェクトを選択すると、検索せずに論文を確認・管理できます:
- 統計情報: 総論文数、Notion登録済み数、スコア分布(棒グラフ)
- Notion連携:
- 全論文をチェック:プロジェクト内の全論文をNotionデータベースと照合
- フィルタ後をチェック:フィルタされた論文のみをチェック(効率的)
- フィルタ:
- 検索セッション(すべて/最新の検索/過去のセッション)
- Notion未登録のみ表示
- 最小スコア(スライダー + 数値入力、双方向連動)
- 最小被リンク数 (NEW) - 指定数以上参照された重要論文のみ表示
- ネットワークグラフ (NEW):
- フィルタ条件を通過した論文のネットワークを可視化
- ハブとなる重要論文を一目で把握可能
- 論文リスト:
- 各論文の詳細情報とAbstract全文
- 評価日時を表示
- 京都大学図書館Article LinkerとNotionページへのリンク
- 「この論文を起点に検索」ボタンで即座に検索開始
- 📝 メモ・コメント機能: 各論文に自分用のメモやコメントを追加・保存できます
- エクスポート: フィルタ後データ、プロジェクト全体
- 論文管理: 各論文の削除(削除後、次回検索時に再評価可能)
AriticleFinder/
├── main.py # Streamlit WebGUI
├── article_finder.py # 論文探索メインロジック
├── pubmed_api.py # PubMed API連携
├── openalex_api.py # OpenAlex API連携(References取得)
├── gemini_evaluator.py # Gemini AI評価
├── embedding_manager.py # アブストラクトのベクトル化(セマンティック・マップ)
├── notion_api.py # Notion API連携
├── project_manager.py # プロジェクト管理
│
├── setup.command # Mac用セットアップスクリプト
├── setup.bat # Windows用セットアップスクリプト
├── run.command # Mac用起動スクリプト
├── run.bat # Windows用起動スクリプト
│
├── requirements.txt # 依存パッケージ
├── .env.example # 環境変数サンプル
├── .gitignore # Git除外設定
├── README.md # このファイル
├── CLAUDE.md # 開発者向けドキュメント
│
├── example_output.json # JSON出力サンプル
├── example_project_export.json # プロジェクトエクスポートサンプル
│
└── projects/ # プロジェクトデータ保存先(自動生成)
└── project_name/
├── metadata.json # プロジェクト情報
├── articles.json # 評価済み論文データ(embedding含む)
└── search_state.json # 中断時の検索状態(一時ファイル)
- 起点論文を取得: PubMed APIから論文情報とアブストラクトを取得
- AI評価: Gemini APIで研究テーマとの関連性を評価
- 関連論文を取得: Similar articles、Cited by、Referencesのリストを取得(設定に応じて)
- 再帰的探索: 関連性が高い論文についてステップ2-3を繰り返す
- 結果出力: 収集した論文をスコア順にソートして表示
- ESummary: 論文のメタデータ取得
- EFetch: アブストラクト取得
- ELink: 関連論文・引用論文のリンク取得
- Similar articles: 類似論文
- Cited by: この論文を引用している論文
- レート制限: 1秒に3リクエストまで(自動調整)
- References(引用文献)の取得: PubMedよりも網羅的な引用データを提供
- メリット:
- PubMedに登録されていない多くの論文のReferencesデータも含む
- 無料で利用可能(API Key不要)
- Polite pool(メールアドレス提供)で10倍高速化
- レート制限:
- デフォルト: 1リクエスト/秒
- Polite pool: 10リクエスト/秒
- 日次制限: 100,000リクエスト
- 詳細: OpenAlex Documentation
- デフォルトモデル: gemma-3-27b-it(API制限が緩やか)
- 利用可能モデル: gemma-3-27b-it, gemini-2.5-flash系, gemini-2.0-flash系など
- 評価基準: ユーザーが探している論文との合致度を0-100でスコアリング
- 評価理由: スコアの根拠を自然言語で説明
- キャッシュ: 一度評価した論文は保存され、再評価を回避してコスト削減
プロジェクトは、特定の研究テーマに関連する論文をまとめて管理する単位です。プロジェクトを使用することで:
- 重複評価を防止: 一度評価した論文は自動的にキャッシュされ、再評価されません
- API コスト削減: Gemini APIの呼び出し回数を削減し、コストを大幅に節約
- 継続的な探索: 複数回に分けて論文を追加できる(API制限による中断後の再開も可能)
- 複数起点からの探索: 異なる起点論文から同じテーマで論文を追加可能
- サイドバーで「新規プロジェクト作成」を選択
- プロジェクト名を入力(例: 「小児喘息の治療研究」)
- 研究テーマを入力
- 起点論文を指定して検索開始
プロジェクトデータは projects/プロジェクト名/ に自動保存されます。
- サイドバーで「既存プロジェクトを開く」を選択
- プロジェクト一覧から対象プロジェクトを選択
- プロジェクト内論文の閲覧・管理、または新しい起点論文を指定して検索開始
重要: 既に評価済みの論文は自動的にスキップされ、新規論文のみが評価されます。
プロジェクトでは、関連性スコア(0-100)はキャッシュされますが、関連性判定(is_relevant)は現在の閾値で再計算されます。
-
最初の検索(閾値80点):
- 65点の論文 → 評価してスコア保存 → is_relevant=False(80点未満)
- 次階層の探索対象外
-
2回目の検索(閾値60点に変更):
- 65点の論文 → スコアはキャッシュから取得(API不要) → is_relevant=True(60点以上に再判定)
- 次階層の探索対象に含まれる!
この仕組みにより、閾値を調整しながら最適な論文収集が可能です。
- スコア: キャッシュから使用(Gemini API不要、コスト削減)
- 関連性判定: 現在の閾値で再計算(柔軟な探索)
projects/
└── プロジェクト名/
├── metadata.json # プロジェクト情報
│ - name: プロジェクト名
│ - research_theme: 研究テーマ
│ - created_at: 作成日時
│ - updated_at: 更新日時
│ - stats: 統計情報
│ - search_sessions: 検索セッション履歴
│
├── articles.json # 評価済み論文データ
│ - article_id: 論文ID(pmid:xxx または doi:xxx)
│ - relevance_score: 関連性スコア
│ - is_relevant: 関連性あり/なし
│ - relevance_reasoning: 評価理由
│ - source_pmid: 発見元のPMID
│ - source_type: 発見元のタイプ(similar/cited_by/references/起点論文)
│ - mentioned_by: この論文を参照している親論文のIDリスト(被リンク)
│ - depth: 探索階層
│ - evaluated_at: 評価日時
│ - comment: ユーザーが追加したメモ・コメント(オプション)
│
└── search_state.json # 中断時の検索状態(一時ファイル)
- start_pmid: 起点論文のPMID
- current_layer: 次に探索する論文リスト
- current_depth: 現在の探索階層
- collected_articles: 収集済み論文データ
- settings: 探索設定
起点論文: 35000000
探したい論文: 小児喘息患者における吸入ステロイド薬の長期使用が成長に与える影響について研究している論文を探しています。
特に低用量から中用量のステロイド使用における安全性や、代替治療法との比較研究に興味があります。
探索深さ: 3
最大論文数: 500
1論文あたりの最大関連論文数: 50
関連性閾値: 80
起点論文: https://pubmed.ncbi.nlm.nih.gov/33000000/
探したい論文: 川崎病における冠動脈病変の予測因子や、免疫グロブリン不応例に対する治療戦略について研究している論文を探しています。
特にステロイドやインフリキシマブなどの追加治療の効果に興味があります。
探索深さ: 3
最大論文数: 500
1論文あたりの最大関連論文数: 50
関連性閾値: 80
年代フィルタ: 2020年以降
- API制限: Gemini APIには無料枠があります。大量の論文を評価する場合は料金が発生する可能性があります
- セマンティックマップ: ベクトル計算にGemini Embedding APIを使用します
- 有料tierのAPIキーが必要ですが、無料枠内で計算可能な場合がほとんどです
- 料金はかからないかごくわずかです
- ネットワークグラフ: 論文数が増えると生成に時間がかかります(1000件以上で数十秒〜数分)
- 処理時間: 論文数や探索深さによっては、数分〜数十分かかる場合があります
- アブストラクト: アブストラクトが取得できない論文は評価スコア0となります
- レート制限: PubMed APIのレート制限により、処理速度が制限されます
Error: Gemini API key is required
→ .envファイルまたはGUIでAPI Keyを設定してください
Error: Invalid PMID or URL
→ 正しいPubMed IDまたはURLを入力してください
Failed to fetch article
→ PMIDが存在するか、PubMed APIが正常に動作しているか確認してください
- UIの最終調整:
- トップページの説明を充実化、主な機能を明確に提示
- サイドバーの項目を使用頻度順に再編成
- 「既存プロジェクトに追加」→「既存プロジェクトを開く」に変更
- 可視化機能の改善:
- ネットワークグラフとセマンティックマップのノード/ポイントクリック時の挙動を統一
- ダブルクリック/クリックで論文詳細へ直接ジャンプ(シンプルで直感的に)
- 無限ループ問題を修正(重複処理の防止ロジックを実装)
- 注意書きの最適化:
- ネットワークグラフ生成の時間に関する注意を強化
- セマンティックマップの不正確な時間推定を削除
- ベクトル計算に有料tierのAPIが必要な旨を明記(無料枠で可能な場合がほとんど)
- DOI対応の完成:
- 起点論文の入力フィールドでDOI対応を明示
- PMIDがない論文もDOIで識別・管理可能に
- ネットワークグラフの大幅改善:
- PyVis から st-link-analysis (Cytoscape.js) へ移行
- ノードサイズを被リンク数に応じて動的変更(20-120px)
- ノード間の距離調整機能を追加(nodeRepulsion, idealEdgeLength, gravity パラメータ)
- ダブルクリックでノード選択、アクションボタン表示機能を実装
- 5段階のスコア評価による色分け(EXCELLENT/GOOD/MODERATE/FAIR/POOR)
- セマンティックマップの機能拡張:
- ポイントクリック機能を追加
- 選択した論文の詳細表示・検索開始機能
- 論文リストへの自動ジャンプ機能
- 検索体験の改善:
- 「この論文で検索」ボタンで自動的に検索開始
- プロジェクト画面、検索結果画面の両方で対応
- バグ修正:
- embedding_manager.py で abstract が None の場合のエラーを修正
- 検索結果画面のネットワークグラフを st-link-analysis 方式に更新
このプロジェクトはMITライセンスの下で公開されています。
- PubMed E-utilities API
- OpenAlex API
- Google Gemini API
- Streamlit
- st-link-analysis
- scikit-learn
- UMAP
- Plotly
バグ報告や機能要望は、GitHubのIssueまでお願いします。