「共感格差」を支える技術 SNS調査の検索・集計に使ったITツールを公開

少し前に、「共感格差」を書いた。ありがたいことに多くの人に読まれたようで、INODS UNVEILにもサマリーを掲載していただいた。
今回は、「共感格差」がどのように書かれたか?それを支える仕組みから説明していこう。
今回の原稿の主旨は、何かを書いたり調べたりする際にシステムから作ろうというものだ。
マスコミのツイートを手軽に検索・集計できる仕組みを作る
3年ほど前にマスコミ各社のSNS(Twitter)アカウントのツイート(その多くは自社ニュース)を収集して、検索、集計が可能なサイトを作った。サイト名を「マスコミツイート横断比較」とした。

現在、以下の報道各社のツイートを収集している。
日本のマスコミツイート(合計491万件)
報道機関名 | Twitterアカウント名 | 開始月 | 件数 |
朝日 | asahi | 2009-06 | 46万件 |
朝日新聞デジタル | asahicom | 2009-07 | 12万件 |
ハフポスト | huffpost | 2013-04 | 30万件 |
時事通信 | jijicom | 2010-05 | 77万件 |
共同通信 | kyodo | 2013-03 | 57万件 |
毎日 | mainichi | 2009-06 | 43万件 |
毎日新聞ニュース | mainichijpnews | 2009-07 | 49万件 |
NHK | nhk | 2010-11 | 68万件 |
日経 | nikkei | 2010-08 | 42万件 |
産経 | sankei | 2012-04 | 32万件 |
読売 | yomiuri | 2010-02 | 30万件 |
アメリカのマスコミツイート(合計450万件)
報道機関名 | Twitterアカウント名 | 開始月 | 件数 |
ABC news | abc | 2008-10 | 43万件 |
CBS news | cbs | 2008-07 | 35万件 |
CNN | cnn | 2007-02 | 38万件 |
フォックス・ニュース | foxnews | 2007-03 | 59万件 |
ハフポスト | huffpost-us | 2008-04 | 61万件 |
NBC news | nbcnews | 2008-03 | 37万件 |
ニューヨークタイムス | nytimes | 2007-03 | 48万件 |
USA Today | usatoday | 2008-08 | 36万件 |
ワシントン・ポスト | washingtonpost | 2008-12 | 47万件 |
WSJ | wsj | 2007-04 | 41万件 |
イギリスのマスコミツイート(合計556万件)
報道機関名 | Twitterアカウント名 | 開始月 | 件数 |
BBC | bbc | 2007-01 | 42万件 |
ファイナンシャルタイムス | financialtimes | 2007-04 | 32万件 |
ガーディアン | guardian | 2009-12 | 85万件 |
インディペンデント | independent | 2008-10 | 127万件 |
ロイター | reuters | 2007-03 | 116万件 |
スカイニュース | sky | 2007-07 | 67万件 |
テレグラフ | telegraph | 2008-09 | 54万件 |
TheTimes | thetimes | 2007-05 | 29万件 |
上記で紹介した「マスコミツイート横断比較」では、各報道機関が、年ごとにどのワードでどのくらい言及したかを可視化できる。
例えば、日本のどの報道機関が安保法制でどのくらいの件数言及したかがわかる。

見たところ、安保法制の言及数は2015年に盛り上がっていた。
安保法制が成立し、施行される頃にはめっきり言及数が減る。施行後の言及は憲法違反かどうかを巡る裁判などが主で、例えば安保法制が台湾有事に与える影響みたいな記事は1件しかなかった。
政局になりそうな瞬間は盛り上がるが、それが実際に運用されるときには興味が薄れるように見える。マスコミツイート横断比較は、このマスコミが興味をなくす様を可視化したくて作成した。このシステムは思わぬ副産物を生んだ。それが、共感格差だ。
言及されるLGBT、言及されない労働者階級
共感格差の着想は、たまたま、”LGBT GAY” を検索したことから始まった。トランプが第一期大統領になる前の2010-2015年のアメリカ大手マスコミのGAY LGBT言及数は9814件、一方、労働者階級(working class、blue collar)の言及数は63件。LGBTへの言及数は、労働者階級の155倍だった。
これは共感や関心の格差と言えるのではないか?という発見が共感格差を思いついたきっかけだった。

マスコミツイート横断比較を支える技術
マスコミツイート横断比較の技術スタック
マスコミツイート横断比較は次のような技術スタックで作られた。

- Twitterからsnscrapeを利用してマスコミツイートを収集する(2022年当時)。
- そのデータをMySQLをベースにした全文検索エンジンMroongaに格納する。
- PythonのWebフレームワークflaskを使って検索UIを作る。
- グラフライブラリのplotlyを使ってグラフを作る。
- 集計結果はredisを使ってキャッシュする。
データの流れをもう少し見ていこう。

Twitterからmroongaへのデータフロー
Twitterから取得したツイートデータは一旦mongoDBに格納。その後mroongaにデータを編集しつつ格納した。
Twitterが返すデータ構造が複雑だったため、一旦mongoDBに入れてその後処理をしたほうが楽であるためだ。Twitterが頻繁に仕様変更する可能性があったためDBのスキーマとミスマッチが生じる可能性があり、そのため、mongoDBを一旦バッファとして扱った。
Twitterから得たデータはmongoDBに生データ(raw data)として格納した。mongoDB格納時にデータを加工をすると予期せぬ仕様変更により、Twitterからデータを取得するプログラムが止まる可能性があるためだ。
mroongaとflaskを使ってWebアプリケーションを作る
こちらは一般的なWebアプリケーションと変わらない。mroongaに格納したツイートデータに対して検索クエリーを生成して結果を出力している。redisをキャッシュとして利用することでレスポンスの向上に努めた。
2022年当時のTwitterデータの取得(現在は禁止されている)
現在はできないが、2022年当時のやり方を書いておく。イーロン・マスク体制になりTwitterからのデータ取得は禁止された。
snscrapeを利用して、以下のようにすれば、例えば朝日新聞のツイートを取得できた。
Twitterには検索クエリーがあり、from:アカウント名 since:いつから until:いつまでを指定すればfromで指定したアカウントの該当期間の投稿を取得できた。
query = “from:asahi since:2022-01-01 until:2022-02-01”
for i,tweet in enumerate(sntwitter.TwitterSearchScraper(query).get_items()):
dkt=dataclasses.asdict(tweet)
その後取得データをmongoDBに格納した。
Mroonga(MySQL全文検索エンジン)の性能
マスコミツイート横断検索では、マスコミの投稿したツイートに指定したキーワードが含まれるかを検索する。記事の文頭に、安保法制が含まれていれば検索は楽であるが、中間に含まれているときは、記事を全部スキャンせねばならず集計が遅くなる。そのような場合は全文検索エンジンを使うと集計が速くなる。
例えば、日本のマスコミツイート471万件に対して、中間一致のSQLで検索・集計するとき(下記)は3.59秒かかるが、
select count(1) as cnt from news where text like “%安保法制%”; –3.59秒
全文検索エンジンを使えば(下記)0.02秒で検索・集計できる。179倍高速化される。
select count(1) as cnt from news where match(text) against(“安保法制” IN BOOLEAN MODE); –0.02秒
全文検索エンジンを使うことで、集計結果をすばやく返すことができる。
InnoDBの集計を事前集計で高速化
MySQLのストレージエンジンはInnoDBとMyISAMがあり、InnoDB のcountは遅いことで知られている。
マスコミツイート横断比較でも、その期間に対するキーワードを含む投稿の割合を出す場所があり、そこでは、その期間での報道各社が全体でどのくらい投稿したかをカウントする処理がある。その処理が重かった。処理が重いと集計レスポンスが遅くなってしまうので、事前に報道機関ごとに日ごとに集計をカウントして、それを年で合計することで集計を高速化した。

まとめ
共感格差を書くにあたり、どのような契機でどのようなツールでその着想を得たかを振り返った。何かを調査する際に、そのためのツールから作っていくというアプローチはちょっとユニークかも知れないなと思っている。
なにか調査をする際は、ツールから作っていくと思わぬ発見があるのでおすすめである。