議員データ
対象: 国会 / 地方議会
👀 ざっくり言うと
国会議員と地方議員の氏名・ふりがな・選挙区・所属政党などの基本情報を、各政党公式サイトや議会公式サイトから自動収集しています。 会議録から抽出した発言者(speaker)をLLMで議員本人に照合し、発言と議員を紐付けた上で、政党・会派の所属履歴も時系列で記録します。
🔄 データの流れ
graph TD
A["政党公式サイト
所属議員一覧ページ"]:::source
B["議会公式サイト
会派名簿ページ"]:::source
C["国会会議録API
発言者のふりがな"]:::source
D["Wikipedia
議員記事"]:::source
M["管理画面からの手動入力
Streamlit 議員・政治家管理"]:::source
P1["議員一覧取得
Playwrightでページを取得"]:::process
P2["構造化抽出
BAMLで氏名・選挙区・政党を抽出"]:::process
P3["名簿テキスト解析
BAMLで議員名・役職・会派を抽出"]:::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
V["dbt Data Vault層
hub / sat / link モデル"]:::process
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 --> V
T_PGM --> V
T_PMH --> V
T_SP --> V
V --> 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.py | Playwrightで議員一覧ページを取得し、氏名・選挙区・政党所属をBAMLで構造化抽出 |
| 議会公式サイト(会派・委員会名簿) | src/infrastructure/external/langgraph_parliamentary_group_member_extraction_agent.py | 名簿テキストからBAMLで議員名・役職を構造化抽出。ルールベースで信頼度0.9以上を優先採用、残りをLLMで補完 |
| 政党 × 選挙当選者 → 会派の紐付け | scripts/link_parliamentary_groups.py / link_parliamentary_groups_bulk.py | 国政選挙で当選した政党所属議員を、parliamentary_group_parties の対応表に基づいて会派に自動登録 |
| 発言者 ↔ 政治家 の照合 | src/infrastructure/external/langgraph_politician_matching_agent.py | 会議体・政党名・発言時期を考慮してSpeakerを政治家に紐付け。信頼度スコアを保持し低信頼は手動レビューに回す |
| 国会API → ふりがな補完 | scripts/backfill_politician_furigana.py | マッチ済みSpeakerのname_yomi(国会API由来)をPolitician.furiganaに書き戻し |
| 管理画面からの手動入力(Streamlit) | src/interfaces/web/streamlit/views/politicians_view.py / conversations/components/politician_creation_form.py | 議員一覧ページから政治家の新規登録・属性編集。発言者マッチングのレビュー画面から「新規政治家として登録」するパスもあり、スクレイプで取れない議員を手動で補完 |
DBテーブル(PostgreSQL)
| テーブル | 説明 |
|---|---|
politicians | 政治家の基本情報(氏名・ふりがな・選挙区) |
political_parties | 政党マスタ |
parliamentary_groups | 議会内会派(chamber・有効期間つき) |
parliamentary_group_memberships | 政治家の会派所属履歴 |
party_membership_history | 政治家の政党所属履歴 |
conference_members | 議会(Conference)への構成員情報 |
speakers | 発言者レコード(politician_idに紐付く) |
dbtモデル(Data Vault層)
| モデル | 役割 |
|---|---|
hub_politician | Politician のハブ |
sat_politician | Politician の属性サテライト |
hub_political_party | 政党のハブ |
sat_political_party | 政党の属性サテライト |
hub_parliamentary_group | 会派のハブ |
sat_parliamentary_group | 会派の属性サテライト |
link_pg_membership | 政治家 ↔ 会派 の所属履歴リンク |
link_speaker_politician | 発言者 ↔ 政治家 の名寄せリンク |
BigQuery公開テーブル
| テーブル | データセット |
|---|---|
politicians | sagebase |
political_parties | sagebase |
parliamentary_groups | sagebase |
parliamentary_group_memberships | sagebase |
conference_members | sagebase |