国会議員の頻出語・特徴語を抽出するサイトを作った話

この記事は[CivicTech ＆ GovTech Advent Calendar 2021](https://qiita.com/advent-calendar/2021/civictech)の21日目の投稿です。

国会で「誰が」「何を」「どのくらい」言ったか採掘するサイト『国会採掘』を作った話をします。


# どういうサイト？
国立国会図書館の国会議事録検索システムで収集した議事録データから、使用されている単語を抽出・集計し、発言者ごとにまとめたサイトです。

https://kokkaisaikutsu.github.io/

議事録を形態素解析して議員ごとに使用単語の頻度とTF-IDF値を求めて、上位100語をリストアップしています。

さらに議員ページの単語リストをクリックすると、該当単語が使用された議事録の抜粋を表示します。
また抜粋ウィンドウの日付欄の議事堂アイコンをクリックすると、国立国会図書館の議事録にジャンプします。


https://twitter.com/KokkaiSaikutsu/status/1422764294786060290?s=20


# なんで作ったの？
このサイトで実現したかったのは以下の3点です。

- （作成者(＝私)の）政治観を排除した議員データ提示
- 事実に基づいた議員データ提示
- 個々の議員へのフォーカス

## （作成者(＝私)の）政治観を排除した議員データ提示
我々はネットや雑誌で様々な政治記事を読むことが出来ます。
しかし各記事には当然筆者がおり、文章により何かを述べる以上はその政治観を排除することができません。また政治記事・経済記事はその筆者の主張が根底にあり、議員評もその主張に引っ張られます。
それを踏まえると、記事に国会議員の評価が記載されていたとしても、それを鵜呑みにすべきではありません。

では個々人が議員の発言・行動をチェックして評価を下せば良いのかというと、日々の生活がある中でその作業をこなすのは、多くの人にとっては不可能ではないでしょうか。

このような状況を少しでも改善するため、国会採掘というサイトを立ち上げました。

国会採掘では、プログラムを用いて議事録のテキストデータから単語を機械的に抽出しています。そのため単語の抽出段階では作成者(私)の主観も排除できます。
（抽出プログラムは私が書いているのでそこに恣意性が入り込む可能性があるというご指摘はあり得ると思います。それについては抽出の方法を（ほんの概要程度ですが）「[このサイトについて](https://kokkaisaikutsu.github.io/about.html)」というページで説明し、抽出結果のサマリー（該当単語の言及回数＆言及者数）を各単語の抜粋ウィンドウで示すことで、透明性と検証可能性を確保しているつもりです。

ただし国会採掘で提示するデータは、議員がよく発言する「単語」とその単語が使われた時の「議事録の抜粋」のみです。
これにより「議員がどのような問題に関心を持っているか」は確認できますが、それより一歩踏み込んだ「主張が妥当か」「発言に根拠があるか」「実現可能な政策か」といった発言評価や、ひいては「我々の代理人として行政・立法を任せるべき人物か」といった人物評価は利用者の皆様に行なっていただく必要があります。


## 事実に基づいた議員データ提示
現在メディアやネットでは与野党問わず様々な政党の評価が入り乱れています。
その中には都合の良い部分だけを抜き出すなど国会での実際の発言とかけ離れたものや、事実というより単なるレッテル貼りに過ぎないもの、酷い場合には虚偽の情報もあります。さらに選挙時には候補者は公約を掲げますが、単に耳触りのいい言葉だけを並べている可能性も否定できません。
このような問題に対抗するには"事実"を提示し検証していくしかありません。

国会採掘は国会議事録という公式に記録された"事実"のみを用いて単語を抽出します。先ほど述べた通りプログラムを用いて機械的に抽出するため、恣意的な情報の抜き出しが生じる余地がありません。

ただし国会では様々な"事実"が存在します。
国会議員としては質問主意書の提出、議員立法発議、党内での議論や各種調査なども仕事に含まれます。閣僚であれば国会答弁以外に、当然行政府としての実務があります。
国会議員の仕事が多岐に渡るという事実に対して、国会採掘で対象としているのは国会議事録のテキストデータというほんの一部に過ぎません。
そのため国会採掘は国会議員を知る情報チャネルのひとつとして活用いただければと思います。


## 個々の議員へのフォーカス
数年ごとにある衆院選・参院選で私が一番困るのが選挙区での投票です。ニュース等で各政党の主張などは知ることが出来ますが、議員個人の仕事ぶりはなかなか知る機会が少ないのではないかと思います。
しかしニュースで報道されないだけで、それぞれの議員はその志に従って仕事をされています。また一部の問題については議員連盟を結成し、超党派で活動をされている議員もいます。

議員個人を知らずに選挙に臨むのはあまりにも勿体ないと思います。

政党だけではなく人を見て選択したい、という場合に是非活用していただければと思います。


# 技術的な話
国会採掘は以下の流れでページを生成しています。

1. 国立国会図書館から国会議事録をダウンロード（前回生成時からの差分のみ）
2. 議事録データから発言部分をスクレイピング（約3年分）
3. 発言データの形態素解析を行い単語(名詞のみ)を抽出
4. 日付・発言者名・発言単語・単語の出現回数をセットにしてデータベースに格納
5. 衆議院・参議院・首相官邸のサイトから議員データを抽出
6. 各議員を1文書とみなして各単語のTF-IDF値を計算
7. TF-IDF値を元に各議員のワードクラウドを生成
8. 各議員の単語の出現回数のTop100リストを生成
9. 各議員の単語のTF-IDF値のTop100リストを生成
10. 議事録データから⑧⑨の単語が出現する部分を抜粋

形態素解析器には[Janome](https://mocobeta.github.io/janome/)を使用しています。
選定理由はカスタム辞書を使用する際のハードルが非常に低かったためです。
解析速度はMeCabが圧倒的に速いのですが、カスタム辞書(ユーザ辞書)をコンパイルするのが面倒だったので採用を見送りました。
（JanomeはCSVを食わせるだけでコンパイル等が不要なので楽）

国会採掘はGithub Pages上で静的なページのみで構成しているため、ページ生成の処理は開発マシンでバッチ実行しています。
処理で一番時間がかかるのは議事録抜粋の部分です。この処理だけで1週間程度かかります。
時間がかかる理由は、追加の議事録をダウンロードする度に、既存の議事録も含めて抜粋処理を一から行なっているためです。差分だけを生成して既存ファイルに追記すれば時間はかからないのですが、その処理を実装する工数がないというのが実際のところです。


# 今後
今後は以下のような感じで改良していきたいです。
やりたい内容と実現に際しての課題を書いておきます。

1. 選挙区から議員を探せるようにする
2. 参考人の発言も見れるようにする
3. 単語から議員を辿れるようにする
4. 単語の出現頻度ヒートマップ（Githubの草みたいな）
5. 同一の意味の単語をまとめて、表現の揺らぎを吸収する
6. 年ごと、月ごと、日ごとの頻出語・特徴語を出す

## 選挙区から議員を探せるようにする
これは衆院選に間に合わせたかったのですが、プライベートが多忙になったためあえなく見送りに……。
ちなみに今も忙しいです。
当選区は衆参の一覧から引けるのですが、出馬区も欲しいよなぁ（比例復活を想定）……とかやりだすと結構沼です。

## 参考人の発言も見れるようにする
ここ2年間は実務部隊である官僚や専門家の方の発言が注目された年でした。参考人も政府側・野党側と様々な立場の方がいらっしゃったので、誰がどのテーマについてどのように発言したのかを見れるだけでも、非常に価値があるのでは、と考えています。
ただ参考人は所属団体・肩書きが多岐にわたり、かつ人数も多いため、一覧にする際にどう見せるかは悩ましいところです。
また参考人は国会議事録でも人名に読み仮名がついていないので、五十音順に並べることができないのも悩みポイントです。
（議員は議事録に読み仮名がついていますし、衆参の議員一覧から引いてくることも出来ます。参考人は議事録に読み仮名がついてないです。つけてほしいなぁ）

## 単語から議員を辿れるようにする
現在は議員から頻出語を引けるようにしていますが、特定のテーマについて誰がどういう発言をしているかを知りたい方も多いと思います。
ただこれも一覧でどう見せるか、一覧化した際に単語を何個まで載せるかが悩みどころです。
さすがに2年間で1回しか登場しなかった単語まで載せる気はないので。

## 単語の出現頻度ヒートマップ（Githubの草みたいな）
「単語から引ける機能を実装した後で」という前提ですが、あるテーマがどのくらいの時期に盛り上がっていたのかを見れたら面白いかなぁと思っています。

## 同一の意味の単語をまとめて、表現の揺らぎを吸収する
議事録を文字起こしする方（あるいは速記者？）が複数人おられるのだと思いますが、単語の揺らぎが多々あります。
例えば「GoToキャンペーン」という単語は「ゴー・トゥー・キャンペーン」という表記になっていることがあります。あるいは「経済産業省」「経産省」などの略語も同様です。
これ、同じ意味の単語なのに集計時には違う単語として処理されてしまうんですよね。
そうなると本当は頻出語・特徴語リストで上位にくるはずなのに不当に順位が下がる（重視するテーマを正しく集計できていない）という現象が発生してしまいます。

この問題については言い換えリストを作成して変換をかけることで対応したいと考えています。

## 年ごと、月ごと、日ごとの頻出語・特徴語を出す
ある時期にどのテーマが話題になっていたのかを確認できるという点では単語ヒートマップと似ているのですが、単語ヒートマップは単語を軸に時期を確認できるのに対して、これは時期を軸に単語を確認できます。
議員の頻出語・特徴語の処理を流用できるのでヒートマップよりこっちの方が実装は楽かなと思います。

# 最後に
このサイトを公開した当初、国会議員をはじめとして多くの方の反響を頂きました。
また他のCivic Techサービスを運営されている方から連携のご提案も頂き、大変嬉しくありがたく思います。
（当初不具合を抱えていたことなどからお断りいたしました。）

公開当初は集計処理に不具合があり、議員および利用者の皆様にご迷惑をおかけしましたことをお詫び申し上げます。

個人の趣味プロジェクトということもあり、更新スピードが遅く恐縮ですが、今後も応援いただけると嬉しいです。