Back to skills
extension
Category: Development & EngineeringNo API key required

data-processing-workflows

Explains the data processing workflow and pipeline of Polibase. It gets activated when understanding the processing flow, dependencies, and execution order of processes such as minutes processing, web scraping, politician data collection, speaker matching, etc.

personAuthor: jakexiaohubgithub

Data Processing Workflows(データ処理ワークフロー)

目的

Polibaseの各種データ処理ワークフロー、パイプライン、システム設計原則を理解し、正しい順序で処理を実行できるようにします。

いつアクティベートするか

このスキルは以下の場合に自動的にアクティベートされます:

  • src/minutes_divide_processor/, src/web_scraper/, src/party_member_extractor/ ディレクトリでの作業時
  • ユーザーが「処理フロー」「パイプライン」「ワークフロー」「データ処理」と言った時
  • 処理の順序や依存関係に関する質問時
  • 議事録処理、スクレイピング、話者マッチングの実装・修正時

システム設計原則

Polibaseは以下の6つの設計原則に基づいています:

1. 政治家情報は政党Webサイトから取得

  • 政治家データは政党の公式Webサイトから取得
  • 定期的に更新して最新情報を維持
  • 名前、役職、選挙区などを構造化して抽出

2. 話者と発言内容は議事録から抽出

  • 話者名と発言内容を議事録から抽出
  • 会話のコンテキストと順序を維持
  • conversationsspeakers テーブルに構造化データとして保存

3. 話者-政治家マッチングはLLMを活用

  • 名前のバリエーションや敬称の処理にLLMを使用
  • ルールベース + LLMのハイブリッドアプローチ
  • speakerspoliticians の高精度なリンク

4. 議員団(Parliamentary Groups)管理

  • 議員団は会議内の投票ブロックを表現
  • 役職(団長、幹事長など)付きのグループメンバーシップ履歴を追跡
  • 提案の投票を個々の政治家とグループの両方にリンク

5. 会議メンバー抽出は段階的処理

  • members_introduction_url から段階的にメンバーを抽出
  • 中間データ用のステージングテーブル(extracted_conference_members
  • 信頼度スコア付きのLLMベースファジーマッチング
  • 最終所属作成前の手動レビュー機能

6. データ入力はStreamlit UIから

  • 政党メンバーリストURLをWeb UIで管理
  • 議事録URLの登録と管理
  • 会議メンバー紹介URLの管理
  • すべてのデータ入力をユーザーフレンドリーなインターフェースで

処理パイプライン

標準フロー(PDFから)

PDF議事録
  ↓
[1] Minutes Divider
  ↓ 個別の発言に分割
Conversations
  ↓
[2] Speaker Extraction
  ↓ 話者情報を抽出
Speakers
  ↓
[3] Speaker Matching
  ↓ 政治家とマッチング
Linked Conversations

ステップ1: Minutes Divider

ファイル: src/minutes_divide_processor/

処理内容:

  • PDF議事録をLangGraphの状態管理とGemini APIで処理
  • 個別の発言に分割して抽出

入力: PDF議事録 出力: conversations テーブルのレコード

ステップ2: Speaker Extraction

ファイル: src/extract_speakers_from_minutes.py

処理内容:

  • 会話から話者情報を抽出
  • 話者レコードを作成

入力: conversations テーブル 出力: speakers テーブルのレコード

ステップ3: Speaker Matching

ファイル: update_speaker_links_llm.py

処理内容:

  • ルールベース + LLMのハイブリッドマッチング
  • 会話を話者レコードにリンク

入力: speakers, politicians テーブル 出力: リンク済み conversations

ステップ4: Politician Data Collection

コマンド: sagebase scrape-politicians

処理内容:

  • 政党Webサイトから最新の政治家情報を取得

入力: political_parties.members_list_url 出力: politicians テーブルのレコード

Web Scraping フロー(GCS統合)

議会Webサイト
  ↓
[1] Web Scraper (--upload-to-gcs)
  ↓ GCSにアップロード
GCS Storage (gs://bucket/...)
  ↓ URI保存
Meetings Table (gcs_pdf_uri, gcs_text_uri)
  ↓
[2] Minutes Divider (--meeting-id)
  ↓ GCSから直接取得
標準フローに合流

ステップ1: Web Scraper

ファイル: src/web_scraper/

処理内容:

  • 議会Webサイトから議事録を抽出
  • kaigiroku.netシステムに対応(多くの日本の地方議会で使用)
  • JavaScriptベースサイト用にPlaywrightを使用
  • --upload-to-gcs フラグでGCSに自動アップロード
  • GCS URIを meetings テーブルに保存

対応システム:

  • kaigiroku.net(日本の地方議会で広く使用)

オプション:

  • --upload-to-gcs: GCSにアップロード

ステップ2: GCS-based Processing

コマンド: sagebase process-minutes --meeting-id <id>

処理内容:

  • Minutes Dividerが --meeting-id パラメータでGCSからデータを直接取得

ステップ3: 以降の処理

標準フロー(話者抽出、話者マッチング)と同じ

Conference Member Extraction フロー(段階的処理)

Conference members_introduction_url
  ↓
[1] Extract Conference Members
  ↓ スクレイピング + LLM抽出
Staging Table (extracted_conference_members: status='pending')
  ↓
[2] Match with Politicians
  ↓ LLMファジーマッチング
Staging Table (status='matched'/'needs_review'/'no_match')
  ↓
[3] Create Affiliations
  ↓ status='matched' のみ処理
politician_affiliations

ステップ1: Extract Conference Members

コマンド: sagebase extract-conference-members

処理内容:

  • 会議URLからメンバー情報をスクレイピング
  • Playwright + LLMでメンバー名、役職、政党所属を抽出
  • ステージングテーブル extracted_conference_members に status='pending' で保存

入力: conferences.members_introduction_url 出力: extracted_conference_members (status='pending')

ステップ2: Match with Politicians

コマンド: sagebase match-conference-members

処理内容:

  • LLMベースのファジーマッチング
  • 名前と政党で既存の政治家を検索
  • LLMで名前のバリエーションを処理して最適なマッチを決定
  • マッチングステータスを更新:
    • matched (信頼度 ≥ 0.7)
    • needs_review (信頼度 0.5-0.7)
    • no_match (信頼度 < 0.5)

入力: extracted_conference_members, politicians 出力: extracted_conference_members (status更新)

ステップ3: Create Affiliations

コマンド: sagebase create-affiliations

処理内容:

  • 最終的な政治家-会議の関係を作成
  • matched ステータスのレコードのみ処理
  • 役職付きで politician_affiliations にエントリを作成

入力: extracted_conference_members (status='matched') 出力: politician_affiliations

処理順序のチェックリスト

議事録処理の場合

  • [ ] ステップ1: Minutes Divider で議事録を分割
  • [ ] ステップ2: Speaker Extraction で話者を抽出
  • [ ] ステップ3: Speaker Matching で政治家とマッチング
  • [ ] 順序厳守: この順序を変更しないこと

Web Scrapingの場合

  • [ ] GCS認証: gcloud auth application-default login を実行済み
  • [ ] アップロード: --upload-to-gcs フラグを使用
  • [ ] URI確認: meetings テーブルに gcs_pdf_uri / gcs_text_uri が保存されているか
  • [ ] 処理実行: --meeting-id で処理を実行

Conference Member Extractionの場合

  • [ ] ステップ1: extract-conference-members でスクレイピング
  • [ ] ステップ2: match-conference-members でマッチング
  • [ ] ステップ3: create-affiliations で所属作成
  • [ ] レビュー: needs_review ステータスのレコードを手動確認

追加コンポーネント

Meeting Management UI

場所: src/interfaces/web/streamlit/

機能:

  • URLルーティング付きStreamlitベースWebインターフェース
  • 会議、政党、会議、その他の管理

Party Member Extractor

場所: src/party_member_extractor/

機能:

  • LLMベースで政党メンバーリストページから政治家情報を抽出
  • Gemini APIでHTMLから構造化データを抽出
  • 複数ページのメンバーリストのページネーション対応
  • 重複レコード作成を防ぐ重複チェック実装

Conference Member Extractor

場所: src/conference_member_extractor/

機能:

  • 会議メンバーの段階的抽出とマッチング
  • 中間データレビュー用ステージングテーブル
  • 手動レビュー機能付き信頼度ベースマッチング

詳細リファレンス

詳細なデータフロー図と実装ガイドは reference.md を参照してください。

ダイアグラム

視覚的なフロー図: