会議体データ

対象: 国会 / 地方議会

👀 ざっくり言うと

会議体(Conference)は、議会における会議の単位です。衆議院本会議や参議院予算委員会、京都市議会総務消防委員会のような「どの議会のどの委員会か」を表します。 sage-baseでは、管理画面から直接登録する方法に加えて、会議録の自動収集時に新しい会議体名を検出したら自動でマスタ登録する仕組みも備えています。 会議体ごとに「どの議員が構成員か」も conference_members として記録しています。

🔄 データの流れ

graph TD
    K["会議録スクレイピング処理群
import-speeches / scrape_kaigiroku_meetings
backfill_kaigiroku_minutes"]:::source A["会議録タイトル文字列
『令和5年3月 京都市会 総務消防委員会』等"]:::source B["議会公式サイト
委員会構成一覧"]:::source M["管理画面からの手動入力
Streamlit 会議体管理"]:::source P1["会議体名の抽出
extract_conference_name_from_title() で
タイトル文字列からパース"]:::process P2["会議体種別の分類
classify_conference_type() で
本会議/委員会/特別委員会を判定"]:::process P3["未知の会議体を副次作成
会議登録の直前に自動的にConferenceを新規登録"]:::process P4["構成員の紐付け
選挙当選者からConferenceMemberを生成"]:::process P5["会議体の手動登録・編集
新規作成・属性訂正・削除"]:::process T_CONF["conferences
テーブル(会議体)"]:::table T_CM["conference_members
テーブル(会議体メンバー)"]:::table V["dbt Data Vault層
hub / sat / link モデル"]:::process H["BigQuery公開
sagebase スキーマ"]:::public K --> A A --> P1 P1 --> P2 P2 --> P3 B --> P4 P3 --> T_CONF P4 --> T_CM M --> P5 P5 --> T_CONF P5 --> T_CM T_CONF --> V T_CM --> 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 公開
📂 技術的な詳細(開発者向け)

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

データソーススクリプト主要ロジック
kaigiroku.net 会議タイトルからの副次作成scripts/scrape_kaigiroku_meetings.py(get_or_create_conference / extract_conference_name_from_title / classify_conference_type)会議録タイトルをテナント固有キーワードと正規表現でパースして会議体名を抽出し、本会議/委員会/特別委員会を分類。マスタに無ければその場でConferenceを新規作成
国会会議録API取り込み時の副次作成src/application/usecases/import_kokkai_speeches_usecase.py(_get_or_create_conference)院名+会議名でConferenceを検索。見つからない場合は警告ログ付きで自動作成する
kaigiroku.net 本文バックフィル時の紐付けscripts/backfill_kaigiroku_minutes.py既存MeetingのConference参照を利用してMinutes/Conversationを追加投入(このスクリプト自体はConferenceを作らないが、前段で作成されたConferenceに依存)
選挙当選者からの一括生成scripts/populate_conference_members.pyelection_members(is_elected=true)の当選議員を、院ごとに対応するConferenceのConferenceMemberに一括変換
自治体固有の委員会マスタ取り込みscripts/import_kyoto_city_council.py ほか議会公式サイト掲載の委員会一覧を取り込み、初期マスタとして登録(自治体追加時の一括投入)
管理画面からの手動入力(Streamlit)src/interfaces/web/streamlit/views/conferences/tabs/{new_tab, edit_delete_tab, list_tab}.py会議体管理ページから新規登録・属性編集・削除を実行。スクレイピングで取れない委員会や過去会期の手動補完に使用

DBテーブル(PostgreSQL)

テーブル説明
conferences会議体(本会議・委員会・特別委員会)の基本情報。名称・会期・conference_type・所属議会を保持
conference_members会議体ごとの構成員(所属議員)と役職・開始日

dbtモデル(Data Vault層)

モデル役割
hub_conferenceConference のハブ(ビジネスキー)
sat_conferenceConference の属性サテライト(名称・種別)
link_conference_memberConference ↔ Politician の構成員リンク
sat_conference_member構成員の属性サテライト(役職・期間)

BigQuery公開テーブル

テーブルデータセット
conferencessagebase
conference_memberssagebase
hub_conferencesagebase_vault

このデータ群の処理が副次的に作成/更新するレコード

一部のスクレイピング処理は、主目的のレコードを登録する過程で、 関連する未知のマスタレコードを自動作成します。処理元と生成先の対応を下表に示します。

生成/更新されるテーブルトリガー挙動
conferences他データ群(会議録)のスクレイピング処理の副次作成として生まれるケースありimport-speeches / scrape_kaigiroku_meetings.py が、会議タイトルから未知の会議体を検出した際に自動作成する
conference_membersscripts/populate_conference_members.py選挙データ(election_members)の当選者をConferenceMemberに一括展開。会議体データ単独では生成されない