「ドン・炎上」炎上しやすさを測るWebアプリつくってみた：WRDによる文章類似度解析

# はじめに
### 炎上って何？

私は、炎上を見かけると疑問に思うことがあります。
炎上とは何かと。

<details><summary>炎上の辞書的な意味</summary>

#### 炎上の辞書的な意味　（デジタル大辞泉から一部抜粋）
>１ 火が燃え上がること。
> ２ 野球で、投手が打たれて大量に点を取られること。
> ３ インターネット上のブログなどでの失言に対し、非難や中傷の投稿が多数届くこと。**祭り**。フレーム。フレーミング。

https://kotobank.jp/word/炎上-447739

炎上は**祭り**なのですね...

</details>

<details><summary>哲学者が語る言語の意味</summary>

#### 意味の使用説
> 言語の**意味**とは、その**使用**である
> ー哲学者　ウィトゲンシュタインー

哲学者によると、**状況**(**文脈**)によって、言葉の**意味が変わる**らしいのです。

ex. 「ウチの子、カワいいんです」
→ ウチの子は、子ども？ ペット？ 彼(女)？ PC？

</details>

調べた結果、ある**結論**に辿り着きました。

### 結論：炎上は人それぞれで曖昧である。
~~というか、人そのものが曖昧である...~~

しかし、それだと面白くありません。
そこで、私なりに炎上について向き合いました。

# 炎上しやすさを測るとは
炎上が人それぞれで曖昧です。
それならば、炎上しやすさはどう測ればよいのでしょうか？
### ❌絶対的な炎上しやすさの尺度を強引につくる
絶対的な炎上しやすさなんて測れやしません...
### ⭕️ユーザー自身に炎上について考えてもらう
炎上を判定するのは、あくまで**ユーザー自身**です。
#### 「炎上に対する感覚をユーザ自身に認知させる」
この方が、炎上について深く測れている気がします。

# 炎上について考えてもらうには
ユーザー自身に炎上について考えてもらうにはどうすればよいのでしょうか？
**ある方法**を私は考えました。
### 方法：それっぽい炎上しやすさの尺度を仮につくる
仮の尺度で測った炎上しやすさに対して、ユーザーが**フィードバック**をできたら...
**炎上について考えるきっかけ**ができると考えました。

# それっぽい炎上しやすさの尺度とは

それっぽい炎上しやすさの尺度を考えてみました。

### 考えた尺度の概要
**"暴力団組長"** と**文章**の**WRD**がそれっぽい炎上しやすさの尺度になりうる。

<details><summary>WRDとは？</summary>
Word Rotator's Distance (意訳：単語回転距離)という文章の類似度を測れる手法です。

文章に含まれる単語をベクトル空間上に配置し、そのベクトル空間を用いて文章間の距離を計算する技術です。

文章間のWRD(距離)が小さいほどその文章は似ており、文章間のWRD(距離)が大きいほどその文章は異なります。

ちなみに、値域は0から∞までです。

※ざっくりとした説明です。深く知りたい方は以下の文献を参照してください🙇‍♂️

https://arxiv.org/abs/2004.15003v1

https://qiita.com/kenta1984/items/bad7e2f68331849d0053

</details>


<details><summary>なぜそうなったかの過程</summary>

1\. **炎上しやすい文章**と**炎上しにくい文章**を独断と偏見で集めました。

|炎上しやすい文章|
|:----------|
朝起きたら俺の妹宙ぶらりん。
周りの人みんなコダックに見える。
他人の不幸で飯が食える人間を殺せ。
他人をバカにする人は人間性が欠落しているんじゃにですかね。
こんにちは、おバカさん。
バカとハサミは使いよう。
バカ。
アホ死ね。
人を人とも思わない、非人道的行為。
虐げられる側は一生そっち側にいてくれ。
身長170cm以下の男子に人権はない。
アホばっかで草。
剣道とかいう竹の棒振り回す暴力スポーツ(笑)。
老害は黙ってろ。
健常者だけの世界をつくるんだ笑。
アフリカに向かう。エイズにならないことを願う。冗談です。なるわけない。私、白人だから。
最後の最後まで本気でムカつく!!!!!!!!!!
よく女の子の腕の骨へし折ってたなー てへへ。
モンスターを倒した。これで一安心だ。
俺の尻を舐めろ。
男の浮気はしょうがないから女は黙ってろ。
もう浮気しない、なんてことはない。
あそこのプリクラの機械何回も壊して出禁になっている。
ホモサピ、ナメクジはゴム手袋して触ってたのになんで女にはゴムしなかったんだろうとか5ちゃんに書いたらマジでぶち殺すからな。
ＪＲ博多駅にサリンをまく。
千本鳥居にケンカ売ってきた。
IQが20違うと会話成立しないってマジなんだな。さすが池沼。
どうして生まれてから大人になった時に、照明さんになろうと思ったんだろう？
人の悪口を言ってる時が一番楽しい。
（息子は)ハズレくじと、(娘は)アタリくじ。
まぁでもそれはお得意の体を使ってなんとかするとかさ。
連日走り回ってくださっている吉本興業外部のスタッフさんに対しての吉本興業の対応がナメ腐っていたので、会社ごとガン詰めしました。しっかりしろ！
35(歳)ぐらいを回ると、お母さんの羊水が腐ってくるんですね。
散々僕を馬鹿にした奴らがみんな失業したら会社潰れたり本当大変な事になってるマジでざまーみろ！俺は余裕むしろ　この状況を　自分と向き合える時間が増えとても楽しんでいる！寝ててもお金入って来るシステムを作っておかないと！今後大変な事になるよ。頭使えよ！貧乏人。 
田舎から東京に出てきた若い無垢（むく）な女の子を牛丼中毒にする。 男性から高い食事をおごってもらえるようになれば牛丼は食べない。
デュエマとポケカ一緒にしてるポケカ民キモすぎわロタ。さすが犯罪者予備軍カードゲーム。
私はサイゼリアをおいしいと感じない。
ぺこーらに、告白しようと思ってる。スレのみんなには、悪いけど。抜け駆けで。次の給料日、お金入るから。スパチャして。そこで気持ち伝える。ぺこーらは男の人と付き合ったことないから。びっくりするかもだけど。もう気持ちを伝えるのを我慢できないから。
川端康成はおよそ文章が読めない男だ。今度私の文章を批判しようものなら刺す。
日本国内に蔓延る韓国人を駆除しなくちゃ。
congratulations!君は負け組だ。
社畜さんいわく、残業のことを「二次会」って言うんだって♪そう言うとなんかすごく楽しそうな感じがするねっ二次会がんばって！ぼくはもう寝るよ～。
デートはサイゼリヤやラーメンで満面の笑みをくれ、会計の際には財布を持ち出し「奢ってもらうなんてダメ🥺自分の分は出します😝」と割り勘をし、記念日には4°cのネックレスで涙をこぼす程喜び、「いつも運転ありがとう♡」と書いた手紙と一緒に千円札を包む処女が好みの男へ。●んだ方が楽だと思うよ。
予算が厳しいから任期付は必要、みたいなコメント多数ついたんだけどこれ正気なんかな。全員雇えないから蠱毒して待ってな～てこと？あまりにも馬鹿すぎない？

|炎上しにくい文章|
|:----------|
こんにちは。
こんにちは、今日はいい天気ですね。
こんにちは、今日はいい天気ですね。調子はどうですか？ 
おはようございます！
今日は月曜日！また1週間が始まりますね(^o^)
サッカー観る。
こちらこそありがとうございました！
朝起きたら一晩でYoutubeのチャンネル登録者数が40人も増えていました！一体何があったのか。今日も頑張りましょう！
過ごしやすい気候になってきました。
『パパ！？』と声をかける四男坊。
ラーメン。つけ麺。僕イケメン。
タイトルホルダー、おかえり
「わたしの過去7日間のインプレッションは53万です」(言ってみたかった)。
彼女が綺麗だ。
この点は出ねえよお！！
挽き肉ですっ！
Kポップ最高！！
今日はお母さんのカレー！
全て愛し、全て尊べ。
コダック可愛い。
俺が教育格差の無い世界を作ってやる。
あんなこといいな、できたらいいな。
やっぱ、持つべきものは友だよな。
心の友よ、大感謝。
一人はみんなのために、みんなは一人のために。
この勝利のために、我が手足となって戦ってくれた、仲間達に感謝を！　犠牲となった、全ての思いに、感謝を！　訪れるのは、俺が望んだ世界であり、全てはシュタインズ・ゲートの選択である！
君は友達。
朝日が気持ちいい。
LOVE ALL SERVE ALL. 
平和だなあ。
今日も明日が続きますように。

2\. 自然言語処理の技術で炎上しやすさを測れる手法がないか探しました。

- LLM
ChatGPTなどに代表される大規模言語モデル。オープンソースになっているモデルもあり、最近において精度も向上中です。
- Doc2Vec
文章をベクトル化する技術。文章同士の類似度が出せます。
- **WRD**
Doc2Vecと同じく文章同士の類似度が出せます。

3\. ピックアップした技術で実装に足り得るものがないのかを検討しました。
- LLM
炎上の数値化が上手くできませんでした...
PEFTやプロンプトエンジニアリングを駆使しても回答に**かたより**が出ます。
また、一定の形式での出力が崩れる場合があり、あえなく断念...
- Doc2Vec
学習にかかる時間とコストが莫大で、あえなく断念...
- **WRD**
Word2Vecモデルさえあれば、実行可能！
しかも、テストした結果、精度が良さそう！

その結果、WRDを採用しました。

4\. WRDにおいて炎上度を測る方法を模索しました。

- 使用させていただいたWord2Vecモデル（2019年までの日本語版Wikipediaを学習データとした分散表現ベクトル）
鈴木正敏，日本語 Wikipedia エンティティベクトル，2019年5月20日リリース，jawiki.word_vectors.100d

http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/jawiki_vector/

https://github.com/singletongue/WikiEntVec 

- Word2Vecモデルに登録されている単語（全751358単語）と集めた炎上しやすい文章及び炎上しにくい文章とのWRDを計算しました。
  - 単語と文章のWRDにおいて、炎上しやすい文章に対するWRDの最大値と比較して、それより小さくなった炎上しにくい文章に対するWRDの個数をカウントしました。
  - そのカウントの合計値が小さければ小さいほど、その単語は炎上しやすい文章と炎上しにくい文章の分類がよりできていると考えました。
  - 以下は、カウントの合計値が少ない単語のランキングです。

|優秀な単語|カウントの合計値|単語の意味|
|:----------|:----------|:----------|
暴力団組長|12|暴力団のボス|
廉麟|13|小野不由美の小説『十二国記』に登場するキャラクター|
ミンボー|13|民事介入暴力：民事紛争に暴力的な行為で介入して利益を得る行為。|
五・一五事件|13|昭和に日本で起きた反乱事件：当時の内閣総理大臣である犬養毅が殺害された|
鶚|13|ミサゴという鳥|
銀星号事件|14|アーサー・コナン・ドイル原作のシャーロック・ホームズシリーズの小説|
応学|14|応用科学などの意味|
劉長|14|中国の前漢時代の偉人|
院派|14|平安時代後期から室町時代の仏師の一派|
紹隆|14|前の人の事業を継承し、さらに盛んにすること：他は元号や名前など|
李紅蘭|14|メディアミックス作品であるサクラ大戦シリーズに登場するキャラクター|
ゴルゴ13|14|さいとう・たかを原作の漫画|
東京地検特捜部|14|東京にある地方検察庁の特別捜査部|
修斗|14|格闘技団体や名前など|
分銅|14|質量を量るために使うおもり|
組長|14|ボス|
総長|14|ボス|

結果として、炎上しにくい文章と炎上しやすい文章を完璧に分類することはできませんでした。
しかし、実用に耐えうると考え実装に至りました。

</details>

# 炎上しやすさを測るアルゴリズム
1\. Word2Vecモデルを読み込む
2\. 日本語の形態素解析ができるMeCabを用いて文章を分かち書きをする
（辞書はmecab-ipadic-utf8）
3\. 分かち書きした文章と"暴力団組長"のWRDを求める
4\. 以下の式に従って、炎上度を算出する
```math
\lfloor \max (0, \min (100, \rm{rate}・(\rm{offset} - WRD(暴力団組長, \rm{text})))) \rfloor
```
```math
※\rm{rate}, \rm{offset} は定数
```
すなわち、**ある基準を設けて100点満点換算**をしています。
**ある基準は5段階用意**してあります。その基準によって定数の値が変わります。
```math

\left\{
    \begin{align*}
        \ \rm{rate} = inf, \ \rm{offset} = 0.000 \ if\ \rm{degree} = 甘口\\

        \ \rm{rate} = 650, \ \rm{offset} = 0.750 \ if\ \rm{degree} = 中辛\\

        \ \rm{rate} = 700, \ \rm{offset} = 0.800 \ if\ \rm{degree} = 辛口\\

        \ \rm{rate} = 750, \ \rm{offset} = 0.850 \ if\ \rm{degree} = 大辛\\
        \ \rm{rate} = 000, \ \rm{offset} = -inf \ if\ \rm{degree} = 激辛\\
    \end{align*}
\right.
```

※別途、議論の起こりやすい単語を検出した際は点数を上げています。
（議論の起こりやすい単語の例：戦争、犯罪）

# その他の機能
・LLMを用いて、炎上しやすさ・しにくさの理由付けをする機能を追加しました。（気休め程度）
（使用したLLM：ELYZA-japanese-Llama-2-7b）
https://note.com/elyza/n/na405acaca130

・炎上しやすさを予測するゲームを追加しました。

# Google Colabで動かしてみよう！（コードあり）
![スクリーンショット 2024-01-31 13.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/18cb3225-1381-7fa3-757f-a0dc78b2bd66.png)

ドン・炎上のリンク（Google Colab）：
https://colab.research.google.com/drive/1i4CWoGw61lO1HT3ZdeD-5FZ9MOyY1B7a#scrollTo=K2rz0WTEYkF3
※注意事項
- Googleアカウントが必要です。
- 起動に10分強程度かかります。
- Colab上で生成されたリンクにアクセスしても動作しない可能性があります。
    - その場合は、最後セルだけ実行し直してください...

# 紹介動画
https://youtu.be/sGyxywfleGs