議員データ

対象: 国会 / 地方議会

👀 ざっくり言うと

国会議員と地方議員の氏名・ふりがな・選挙区・所属政党などの基本情報を、各政党公式サイトや議会公式サイトから自動収集しています。 会議録から抽出した発言者(speaker)をLLMで議員本人に照合し、発言と議員を紐付けた上で、政党・会派の所属履歴も時系列で記録します。

🔄 データの流れ

graph TD
    A["政党公式サイト
所属議員一覧ページ"]:::source B["議会公式サイト
会派名簿ページ"]:::source C["国会会議録API
発言者のふりがな"]:::source D["Wikipedia
議員記事"]:::source M["管理画面からの手動入力
CLI / 直接 SQL"]:::source P1["議員一覧取得
Playwrightでページを取得"]:::process P2["構造化抽出
ローカルLLMで氏名・選挙区・政党を抽出"]:::process P3["名簿テキスト解析(現在未配線)
ローカルLLMで議員名・役職・会派を抽出"]:::process P4["会派所属リンク付け
選挙当選者×政党×会派マッピング"]:::process P5["発言者 ↔ 政治家 照合
ルール→LLMハイブリッド"]:::process P6["ふりがな補完
API由来のname_yomiをpoliticiansに反映"]:::process P7["政治家の手動登録・編集
新規作成・属性訂正・紐付けレビュー"]:::process T_POL["politicians
テーブル(政治家)"]:::table T_PGM["parliamentary_group_memberships
テーブル(会派所属)"]:::table T_PMH["party_membership_history
テーブル(政党所属履歴)"]:::table T_SP["speakers
テーブル(発言者)"]:::table H["BigQuery公開
sagebase スキーマ"]:::public A --> P1 B --> P1 P1 --> P2 P1 --> P3 P2 --> T_POL P2 --> T_PMH P3 --> T_PGM P3 --> P4 P4 --> T_PGM C --> P5 P5 --> T_SP P5 --> P6 D --> P6 P6 --> T_POL M --> P7 P7 --> T_POL P7 --> T_PGM P7 --> T_PMH T_POL --> H T_PGM --> H T_PMH --> H T_SP --> H classDef source fill:#ffffff,stroke:#1a1a1a,stroke-width:2.5px,color:#1a1a1a classDef process fill:#ffffff,stroke:#737373,stroke-width:1px,color:#1a1a1a classDef table fill:#ffffff,stroke:#1a1a1a,stroke-width:1.5px,stroke-dasharray: 6 3,color:#1a1a1a classDef public fill:#1a1a1a,stroke:#1a1a1a,stroke-width:2.5px,color:#ffffff
元データ 加工 DB 公開
📂 技術的な詳細(開発者向け)

スクレイパー・インポーター

データソーススクリプト主要ロジック
各政党公式サイト(所属議員一覧)src/infrastructure/external/web_scraper_service.pyPlaywrightで議員一覧ページを取得し、氏名・選挙区・政党所属をローカルLLMで構造化抽出
議会公式サイト(会派・委員会名簿)src/infrastructure/external/parliamentary_group_member_extractor/llm_extractor.py名簿ページのHTMLからローカルLLMで議員名・役職を構造化抽出。**現在この抽出を起動する定期実行経路は無く**、LLM 評価ハーネスからのみ実行される(名簿ページを自動巡回するURL経路は Issue #2747 で撤去。会派所属の現行の投入経路は下記の対応表ベースの登録)
政党 × 選挙当選者 → 会派の紐付けscripts/link_parliamentary_groups.py / link_parliamentary_groups_bulk.py国政選挙で当選した政党所属議員を、parliamentary_group_parties の対応表に基づいて会派に自動登録
発言者 ↔ 政治家 の照合src/infrastructure/external/politician_matching/politician_matching_service.py会議体・政党名・発言時期を考慮してSpeakerを政治家に紐付け。信頼度スコアを保持し低信頼は手動レビューに回す
国会API → ふりがな補完scripts/backfill_politician_furigana.pyマッチ済みSpeakerのname_yomi(国会API由来)をPolitician.furiganaに書き戻し
管理画面からの手動入力(CLI / psql 直接 SQL)sagebase CLI コマンド群 + psql (ADR 0023 で旧 Streamlit admin UI を全廃)議員一覧ページから政治家の新規登録・属性編集。発言者マッチングのレビュー画面から「新規政治家として登録」するパスもあり、スクレイプで取れない議員を手動で補完

DBテーブル(PostgreSQL)

テーブル説明
politicians政治家の基本情報(氏名・ふりがな・選挙区)
political_parties政党マスタ
parliamentary_groups議会内会派(chamber・有効期間つき)
parliamentary_group_memberships政治家の会派所属履歴
party_membership_history政治家の政党所属履歴
pledges政治家の公約
conference_members議会(Conference)への構成員情報
speakers発言者レコード(politician_idに紐付く)

dbtモデル(内部 Data Vault 層 / 非公開)

モデル役割
hub_politicianPolitician のハブ(ビジネスキー = sagebase_id)
sat_politicianPolitician の属性サテライト
hub_political_party政党のハブ(ビジネスキー = sagebase_id)
sat_political_party政党の属性サテライト
hub_parliamentary_group会派のハブ(ビジネスキー = sagebase_id)
sat_parliamentary_group会派の属性サテライト
link_pg_membership政治家 ↔ 会派 の所属履歴リンク(キー = 所属記録自身の sagebase_id)
link_party_membership政治家 ↔ 政党 の所属履歴リンク(キー = 所属記録自身の sagebase_id)
sat_party_membership政党所属履歴の属性サテライト(所属期間)
link_pledge政治家 ↔ 公約 のリンク(キー = 公約自身の sagebase_id)
sat_pledge公約の属性サテライト(見出し・本文)
link_speaker_politician発言者 ↔ 政治家 の名寄せリンク

BigQuery公開テーブル

テーブルデータセット
politicianssagebase
political_partiessagebase
parliamentary_groupssagebase
parliamentary_group_membershipssagebase
party_membership_historysagebase
pledgessagebase
conference_memberssagebase