📚

議会の会議録の整形を自動化するツール「minutes-parser」を開発した話

に公開

🎯 この記事の対象読者

  • 「議会の答弁案の作成、正直つらい…」 と感じている全国の自治体職員の皆さん!
  • 「AIで業務効率化って、具体的にどうやるの?」 と日々模索しているDX推進担当者さん!
  • 「Pythonで実用的なツールを開発してみたい!」 と考えている、そこのあなた!

💡 この記事を読むと得られること

  • 自治体特有の議会の会議録を効率的に構造化するツールの開発背景と具体的な手法がわかります。
  • PythonとGoogle Colabを活用した、手軽に試せるAIツール開発のヒントが得られます。
  • 実際の開発でぶつかった壁と、そのユニークな解決策を知ることができます。

🚀 はじめに:なぜこの記事を書いたか

皆さん、日々の業務、お疲れ様です!特に自治体職員の皆さん、議会の答弁案の作成って、本当に骨が折れますよね…。膨大な量のテキストデータと格闘し、発言者と内容を整理する作業は、時間も労力も尋常じゃないはず。

最近、生成AI、特にRAG(Retrieval Augmented Generation)という技術が、行政の庁内データ活用で注目されていますよね。議会の答弁案作成も、AIとの相性が良いと期待されています。しかし、ここで大きな壁となるのが、議会の会議録のほとんどが、まだAIが扱いづらい「テキスト主体の非構造化データ」であるという現実です。過去の会議録をそのままAIに投入しても、必要な情報(特に日時など!)が抜け落ちてしまい、RAGとしての精度に疑問が残るケースも少なくありません。

そこで、この「会議録データ、なんとかしたい!」という情熱から、議会の会議録を効率的に構造化し、AIでの活用に道を開くPythonツール「minutes-parser」を開発しました!今回は、このツールの開発背景から具体的な仕組み、そして今後の展望まで、語らせていただきます!


😫 課題:答弁案作成のつらい現実

皆さんもご存知の通り、自治体における答弁案の作成(答弁調整)は、まさに時間との戦いです。

答弁案作成の流れ:こんな「あるある」に、心当たりありませんか?

質問者の課題意識の把握や、過去の答弁との整合を図るため過去議事録をキーワード検索、発話者検索をし、さらに発言者と内容の紐付け、そして何より議会独特の言い回しや専門用語の整理…。これ、本当に人間の手作業でやるには限界がありますよね。特に議会の議事録は、テキストベースでデータの構造化がなされていないといった大きな壁もあります。


✨ 解決策:議事録パーサー「minutes-parser」

そんな「つらい現実」を少しでも変えたい!その一心で開発したのが、この議事録パーサー「minutes-parser」です!

このツールは、会議録のテキストデータを基に、議会独自の文書表現ルール(発話者の前の「〇、◎」といった記号など)を認識し、発言者ごとのテキストを分割。さらに、指定のメタデータ(会議名など)を付与した構造化データを自動で作成してくれます。

項目 内容
ツール名 minutes-parser
概要 会議録のテキストデータをベースとして、議会独自の文書の表現ルールである発話者の前の「〇、◎」といった記号で分割し、指定のメタデータを付与した構造化データを作成するもの
利用シーン 議会の会議録のデータ化、RAGへの活用準備
GitHubリポジトリ https://github.com/HosoyaYusaku/minutes-parser

🛠️ 技術スタックと選定理由

「minutes-parser」は、以下の技術スタックで構成されています。

技術 役割 選定理由
Python 開発言語 Pythonは扱いやすく、Google Colabのような環境で手軽に利用できるため、迅速な開発と共有に適していると判断しました。
(要約・構造化) 要約・構造化 会議録のファイル名の命名規則を参照し、会議名などのメタデータを自動で付与することで、効率的な構造化を実現しています。

📜 コードのハイライト

このツールの心臓部である、テキストから発言者と内容を抽出・分割する関数のコードを紹介します。自治体独自の記号を使った発言者の特定と内容の切り出しは、ドメイン知識がなければなかなか気づかなかった泥臭い工夫だと思います!

def process_text_data(text, delimiters):
    if not text or not delimiters: return []
    delimiter_pattern = '|'.join([re.escape(d) for d in delimiters])
    parts = re.split(f'({delimiter_pattern})', text)
    extracted_data = []
    speaker_pattern = re.compile(r'.*?[((].*?[))]')
    for i in range(1, len(parts), 2):
        delimiter, chunk = parts[i], parts[i+1].strip()
        if not chunk: continue
        lines = chunk.split('\n', 1)
        speaker_candidate_line, content_after_first_line = lines[0].strip(), lines[1].strip() if len(lines) > 1 else ""
        speaker, content_first_line = "", ""
        match = speaker_pattern.match(speaker_candidate_line)
        if match:
            speaker = match.group(0).strip()
            content_first_line = speaker_candidate_line[match.end():].strip('  ')
        elif ' ' in speaker_candidate_line:
            # ... (発言者の特定ロジック)
        else:
            # ... (発言者の特定ロジック)
        final_content = (content_first_line + "\n" + content_after_first_line).strip()
        extracted_data.append({"発言者": speaker, "内容": final_content})
    return extracted_data
with output_area: print("💡 処理するファイルをアップロードしてください。")
display(ui_layout)

💻 使い方

「minutes-parser」の使い方は、驚くほど簡単!Google Colabがあれば、すぐに試せます。

① 環境構築

特別な環境構築は不要です!Google Colabにアクセスし、提供されているコードを貼り付けるだけ。Pythonの実行環境がすぐに手に入ります。

② ツールの実行

貼り付けたコードを実行し、処理したい会議録のテキストファイルを命名規則に沿ってファイル名を設定してアップロードするだけ。あとはツールが自動的に処理を進めてくれます。プログラミングの知識があまりなくても、直感的に操作できるはずです。

③ 出力結果(Before / After)

変換されたデータは、日時・発言者・内容が紐づいた、見やすい構造化データとして出力されます。これにより、手作業では難しかったデータの二次利用や、RAGのようなAIモデルへの組み込みがぐっと楽になります!
Before

After


🧗 開発でつまづいた点と解決策

開発中には、もちろん壁にぶつかることもありました。でも、それらを乗り越えることで、ツールはさらに進化しました!

  • 課題1:各構造化のまとまり単位でユニークにする処理をどうするか
    • 原因・解決策: 複数の会議録、それぞれの「発言」をユニークに識別する必要がありました。そこで、会議録の命名規則に含まれる情報(会議名など)をハッシュ化し、さらに連番を振ることで、発言単位の一意性を担保しました。これで、RAGに投入した際も、どの会議のどの発言か、といったメタ情報を確実に紐づけられるようになりました!
  • 課題2:生成したデータが複数ダウンロードされてしまう問題
    • 原因・解決策: Google Colabの仕様上、ファイルを生成すると自動的に複数ダウンロードされてしまうという課題がありました。この問題に対しては、生成したデータを一旦ZIP化し、さらに多段階での処理を実装することで、一括ダウンロードが可能になり、複数ファイルダウンロード問題も解消できました。

🔭 今後の展望と野望

「minutes-parser」は、まだまだ発展途上のツールです!今後は、このツールでパースした会議録データを用いながら、RAGによる精度検証を本格的に実施していきたいと考えています。

具体的には、RAGによる答弁案の精度を向上させるための糸口や、多段階での検索処理による高品質な過去会議録検索の実現など、より高度な実装の方策のイメージをつかんでいきたいです。
最終的には、行政職員の皆さんが探す時間を減らし、より本質的な業務に集中できるような一助となれば嬉しいです。


🔚 おわりに:小さな一歩が、大きな変化を生むと信じて

今回の「minutes-parser」の開発は、小さな一歩かもしれません。しかし、このような地道な取り組みが、自治体のDXを加速させ、いつか日々の業務を劇的に変える大きな変化を生むと信じています。

このツールが、皆さんの日々の「困った」を解決し、さらに多くの行政職員が自ら業務改善に挑戦するきっかけとなれば、これほど嬉しいことはありません。ぜひ、GitHubリポジトリでコードを覗いて、実際に試してみてください!

Discussion