自然言語処理の感情分析は「○ね」をポジティブと分類する

独自に集めた誹謗中傷の単語一覧をGoogleが提供する感情分析APIでネガポジ分類してみました。

その結果、Googleが提供するAPIでは「○ね」がポジティブと分類される結果となりました。Googleが提供するAPIでこの結果になるということは、これが現時点での自然言語処理の限界ということでしょうか。

今回の実験結果をそのまま記載します。なぜこのような結果になるのか、ご意見があればページ下部のコメント欄に書いてもらえるとありがたいです。



## 独自に集めた誹謗中傷の単語一覧

SNS上で使われる誹謗中傷の単語のうち、ネガティブな意味になるものだけを集めました。ネガティブかどうかは私の主観です。正規化はされておらず、SNS上で使われている表現をそのまま抽出しています。

```
死ね 殺す 黙れ 馬鹿 役立たず 無能 やくたたず きいてんのか いいかげんに うるせーよ うるせえ うっせえ 気持ち悪い キモい きもい きしょい うるせえよ うるさい しね くず うざ うざ ころす きえろ ばか だまれ かえれ こら おい きも ごみ ゴミ バカ
```



## 先に結論

Googleが提供するNatural Language APIによる感情分析は、日本語の単語に対してかなり間違った分析結果を提供します。例えば、「死ね」をポジティブと分類します。

Microsoftが提供するText Analytics APIによる感情分析は、英語の文章に対してはそこそこよい分類結果を提供します。日本語には対応していません。



## Google Natural Language APIで分析した結果

集めた単語をGoogle Natural Language APIで感情分析した結果が下記の表です。

**死ね、うっせえ、気持ち悪い**がポジティブ、**殺す**が中立と分類されており、明らかにおかしい結果となっています。

**スコアの解釈について**
今回は 0.3 を中立の閾値と設定しましたが、閾値は実際の例に合わせて調整することが推奨されています。スコアの解釈については [Natural Language API > 感情分析の値の解釈](https://cloud.google.com/natural-language/docs/basics?hl=ja#interpreting_sentiment_analysis_values) をご参照ください。 

| 単語 | ポジティブ 👍 | 中立 | ネガティブ 👎 | スコア |
|:--|:--|:--|:--|:--|
|死ね|o|||0.400|
|殺す||o||0.300|
|黙れ||o||0.300|
|馬鹿|||o|-0.900|
|役立たず||o||0.300|
|無能||o||0.300|
|やくたたず||o||0.300|
|きいてんのか|||o|-0.400|
|いいかげんに||o||0.000|
|うるせーよ|||o|-0.100|
|うるせえ||o||0.300|
|うっせえ|o|||0.400|
|気持ち悪い|o|||0.400|
|キモい||o||0.300|
|きもい||o||0.300|
|きしょい||o||0.000|
|うるせえよ|||o|-0.700|
|うるさい|||o|-0.800|
|しね|o|||0.400|
|くず||o||0.300|
|うざ||o||0.300|
|うざ||o||0.300|
|ころす||o||0.300|
|きえろ||o||0.300|
|ばか|o|||0.400|
|だまれ||o||0.300|
|かえれ||o||0.300|
|こら||o||0.300|
|おい|||o|-0.200|
|きも||o||0.300|
|ごみ|||o|-0.500|
|ゴミ|||o|-0.800|
|バカ|||o|-0.600|


もしかするとGoogleの技術は英語に最適化されており、日本語だから精度が低いのかもしれません。次に、同じ単語を英語に翻訳し同様の分析を試してみます。




## Google Natural Language APIで「英語」を分析した結果

前回と同じ分析を英語で行った結果が下記の表です。日本語では単語でしたが、英語では文章になっています。

ポジティブと分類された文章が1つもないという意味では日本語の分析よりはよい結果といえます。しかし、ほとんどの文章が中立と分類されており、あまり納得感のない結果でもあります。


| 単語 | ポジティブ 👍 | 中立 | ネガティブ 👎 | スコア |
|:--|:--|:--|:--|:--|
|Die||o||0.200|
|I’ll kill you||o||0.300|
|Shut up||o||0.300|
|You’re an idiot||o||0.300|
|You’re useless||o||0.300|
|You’re incompetent|||o|-0.800|
|You’re useless||o||0.300|
|Are you listening?|||o|-0.100|
|Stop it already|||o|-0.800|
|Shut the hell up|||o|-0.800|
|Shut your ass||o||0.300|
|Shut the fuck up||o||0.300|
|You creep me out||o||0.300|
|You’re creepy||o||0.300|
|You’re creepy||o||0.300|
|You’re disgusting||o||0.300|
|Shut up already||o||0.300|
|Shut up||o||0.300|
|Die||o||0.200|
|You’re garbage|||o|-0.800|
|You’re annoying||o||0.300|
|Shit||o||0.300|
|I’ll kill you||o||0.300|
|Disappear||o||0.300|
|Idiot||o||0.300|
|Shut your mouth||o||0.300|
|Go home||o||0.300|
|Hey||o||0.300|
|Hey you||o||0.300|
|You creep||o||0.300|
|You’re garbage|||o|-0.800|
|You’re garbage|||o|-0.800|
|You're an idiot||o||0.300|



Googleが提供するNatural Language APIは日本語と英語の両方であまりよい結果になりませんでした。

もしかするとGoogleが提供しているAPIに問題があるだけで、Microsoftが提供する類似のAPIであれば違った結果になるかもしれません。次は、Microsoftが提供するText Analytics APIを試してみます。



## Microsoft Text Analytics APIで「英語」を分析した結果

前回と同じ英語の文章をMicrosoft Text Analytics APIで感情分析した結果が下記の表です。

ほとんどの文章がネガティブと分類されており、Googleの結果と比べるとかなり納得感のある結果になっています。

※ Microsoftが提供するAPIでは日本語を分析できませんでした。

| 単語 | ポジティブ 👍 | 中立 | ネガティブ 👎 |
|:--|:--|:--|:--|
|Die|||o|
|I’ll kill you|||o|
|Shut up||o||
|You’re an idiot|||o|
|You’re useless|||o|
|You’re incompetent|||o|
|You’re useless|||o|
|Are you listening?||o||
|Stop it already||o||
|Shut the hell up|||o|
|Shut your ass|||o|
|Shut the fuck up|||o|
|You creep me out|||o|
|You’re creepy|||o|
|You’re creepy|||o|
|You’re disgusting|||o|
|Shut up already||o||
|Shut up||o||
|Die|||o|
|You’re garbage|||o|
|You’re annoying|||o|
|Shit|||o|
|I’ll kill you|||o|
|Disappear||o||
|Idiot|||o|
|Shut your mouth||o||
|Go home||o||
|Hey||o||
|Hey you||o||
|You creep|||o|
|You’re garbage|||o|
|You’re garbage|||o|
|You're an idiot|||o|



ここまでの結果を見る限り、Googleが提供するAPIで日本語を分析した場合に特に結果が悪くなることが分かりました。

今までは話し言葉を入力として与えていたのであまり結果がよくなかったのかもしれません。自然言語処理のために用意された辞書に含まれる単語であれば違った結果になると仮定して、最後に、日本語評価極性辞書に含まれる単語をGoogle Natural Language APIで分析してみます。



## Google Natural Language APIで「英語」を分析した結果

日本語評価極性辞書から「死」という漢字が含まれており、かつ、ネガティブな意味に分類されている単語だけを抜粋してGoogle Natural Language APIで分析した結果が下記の表です。

すべてネガティブと分類されてほしいのですが、ポジティブと分類される単語がたくさんあります。特に、「死に場所」と「死に神」はポジティブの度合いが強くなっています。


| 単語 | ポジティブ 👍 | 中立 | ネガティブ 👎 | スコア |
|:--|:--|:--|:--|:--|
|安楽死|||o|-0.500|
|一死||o||0.300|
|過失致死||o||0.000|
|過労死|||o|-0.600|
|餓死|o|||0.400|
|壊死||o||0.300|
|急死||o||0.300|
|枯死|o|||0.400|
|交通死亡事故|||o|-0.400|
|死|||o|-0.800|
|死に場所|o|||0.600|
|死に神|o|||0.700|
|死に体||o||0.100|
|死骸||o||0.300|
|死角||o||0.300|
|死期||o||0.300|
|死球|o|||0.400|
|死去||o||0.300|
|死刑|||o|-0.300|
|死刑判決||o||0.000|
|死語|||o|-0.700|
|死罪|||o|-0.400|
|死産||o||0.000|
|死者|||o|-0.200|
|死出の旅|||o|-0.200|
|死傷者||o||0.000|
|死人|||o|-0.300|
|死線|o|||0.400|
|死相||o||0.300|
|死体||o||0.300|
|死地|||o|-0.600|
|死闘||o||0.300|
|死病|||o|-0.600|
|死亡|||o|-0.600|
|死亡者|||o|-0.200|
|死没||o||0.300|
|死魔||o||0.300|
|死滅|o|||0.400|
|死霊|||o|-0.700|
|事故死|||o|-0.800|
|傷害致死|||o|-0.700|
|戦死||o||0.300|
|戦死者||o||0.000|
|致死||o||0.000|
|溺死|o|||0.400|
|凍死||o||0.300|
|脳死||o||0.000|
|半死|o|||0.400|
|半死半生|||o|-0.700|
|瀕死||o||0.300|
|変死||o||0.300|
|万死|||o|-0.500|




## 最後に

実験前に想定していたよりも間違った分類の割合が非常に多くて驚きました。誹謗中傷の自動分類はどのSNSもまったくうまくいっていませんが、その原因の1つが自然言語処理の技術の未熟さにあるのかもしれません。今後の技術の発展に期待します。参考リンク：[Instagramがハラスメントに対処する新しいツール「Limits」のテストをしていることを認める](https://jp.techcrunch.com/2021/07/25/2021-07-22-instagram-confirms-test-of-new-anti-harassment-tool-limits-designed-for-moments-of-crisis/)

ドキュメントを見る限り、今回調査したGoogleとMicrosoftのAPIは単語や短い文章ではなく長文に最適化されているような記述があるため、短い文章だとうまくいかないという弱点があるのかもしれません。