AgentSkillsCN

data-processing-workflows

说明Polibase的数据处理工作流程与流水线。在理解会议记录处理、网络爬虫、政治人物数据收集、政治人物匹配等处理流程、依赖关系及执行顺序时启用。

SKILL.md
--- frontmatter
name: data-processing-workflows
description: Polibaseのデータ処理ワークフローとパイプラインを説明します。議事録処理、Web scraping、政治家データ収集、政治家マッチングなどの処理フロー、依存関係、実行順序を理解する際にアクティベートされます。

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

目的

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

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

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

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

システム設計原則

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から)

code
PDF議事録
  ↓
[1] Minutes Divider
  ↓ 個別の発言に分割
Conversations
  ↓
[2] Speaker Extraction
  ↓ 話者情報を抽出
Speakers
  ↓
[3] Politician 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: Politician Matching

ファイル: src/infrastructure/external/politician_matching/

処理内容:

  • ルールベース + LLMのハイブリッドマッチング
  • 話者を政治家にリンク

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

ステップ4: Politician Data Collection

コマンド: sagebase scrape-politicians

処理内容:

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

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

Web Scraping フロー(GCS統合)

code
議会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 フロー(段階的処理)

code
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: Politician 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インターフェース
  • 会議、政党、会議、その他の管理

Conference Member Extractor

場所: src/conference_member_extractor/

機能:

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

詳細リファレンス

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

ダイアグラム

視覚的なフロー図: