極性判定のニュートラルのデータを補強する

## はじめに
[Apitore](https://apitore.com/)では[極性判定WebAPI](https://apitore.com/store/apis/details?id=11)を無償で提供しています。[Qiita](http://qiita.com/keigohtr/items/e85b413283b87ac02f4b)でもそこそこ反響があった技術です。今回はデータが少なかったNeutralについてDistant Supervisionで補強を試みました。

<img src="http://blog.apitore.com/wp-content/uploads/2016/10/amarec-20161023-142925-1024x635.png" alt="" width="720" height="446" class="aligncenter size-large wp-image-514" />

<!--more-->

## デモサイト
- [みんなで改善するSocial Sentiment](https://mashup.apitore.com/social-sentiment/index.html)
- [APIはこちらから利用できます](https://apitore.com/store/apis/details?id=11)

## サンプルコード
- [Java](https://github.com/keigohtr/apitore-response-parent/tree/master/word2vec-response)
- [Ruby](https://github.com/keigohtr/apitore-sdk-ruby/tree/master/api_11_sentiment)
- [AppleScript（ぴよまる様）](http://piyocast.com/as/archives/4289)


## やったこと
[Apitore](https://apitore.com/)の[極性判定技術](https://apitore.com/store/apis/details?id=11)はDistant Supervisionをベースに、[乾研究室の極性辞書](http://www.cl.ecei.tohoku.ac.jp/index.php?Open%20Resources%2FJapanese%20Sentiment%20Polarity%20Dictionary)と[皆様からのフィードバック](https://mashup.apitore.com/social-sentiment/index.html)でオンライン学習をしたものになります。Distant SupervisionはTwitter社の提供する極性判定結果を使っていました。なので、PositiveとNegativeしか集められていませんでした。今回やったことは、NeutralツイートをDistant Supervisionで集めようという試みになります。作業は以下になります。

1. 手作業で作った約3000語の目的語リストを使って、TwitterのSearchAPIでツイートを収集します。およそ200万ツイート集めました。
1. [乾研究室の極性辞書](http://www.cl.ecei.tohoku.ac.jp/index.php?Open%20Resources%2FJapanese%20Sentiment%20Polarity%20Dictionary)に掲載されているpositiveとnegativeの単語を含まないツイートを抽出しました。200万ツイートから取れるだけ取ると過学習する可能性があるので、positiveやnegativeの学習データを参考に適当に決めました。今回は約7万ツイートです。


## 結果
評価データは前回までのもの+αに、今回のDistant Supervision版Neutralデータ（学習につかったものとは別）を追加しました。下に結果を載せます。「0=positive」「1=negative」「2=neutral」です。

Before（2016年11月21日版）

```
Examples labeled as 0 classified by model as 0: 4076 times
Examples labeled as 0 classified by model as 1: 2218 times
Examples labeled as 0 classified by model as 2: 3335 times
Examples labeled as 1 classified by model as 0: 1327 times
Examples labeled as 1 classified by model as 1: 28105 times
Examples labeled as 1 classified by model as 2: 4141 times
Examples labeled as 2 classified by model as 0: 11196 times
Examples labeled as 2 classified by model as 1: 9941 times
Examples labeled as 2 classified by model as 2: 4784 times
```

After（2017年5月12日版）

```
Examples labeled as 0 classified by model as 0: 7048 times
Examples labeled as 0 classified by model as 1: 759 times
Examples labeled as 0 classified by model as 2: 1822 times
Examples labeled as 1 classified by model as 0: 2090 times
Examples labeled as 1 classified by model as 1: 28438 times
Examples labeled as 1 classified by model as 2: 3045 times
Examples labeled as 2 classified by model as 0: 1101 times
Examples labeled as 2 classified by model as 1: 1015 times
Examples labeled as 2 classified by model as 2: 23805 times
```

結果から分かるとおり、BeforeはNeutral（っぽい）データをNeutralと判定できていません。学習に使ったデータがほとんどないので・・・まあ当然ですね。一方で、AfterはNeutral（っぽい）データをNeutralと判定できています。

次に、実際のツイートの結果を見てみましょう。めんどくさかったので、Afterだけですし、画像で失礼。まあ、いい感じですね。

<img src="http://blog.apitore.com/wp-content/uploads/2017/05/amarec-20170512-220657.png" alt="" width="592" height="736" class="aligncenter size-full wp-image-1008" /><img src="http://blog.apitore.com/wp-content/uploads/2017/05/amarec-20170512-220714.png" alt="" width="592" height="704" class="aligncenter size-full wp-image-1009" /><img src="http://blog.apitore.com/wp-content/uploads/2017/05/amarec-20170512-220732.png" alt="" width="592" height="328" class="aligncenter size-full wp-image-1010" />


## おわりに
なぜ最初からこれをやらなかったのかってくらい、単純な話でした。Neutralに出力する割合がかなり増えたので、様子をみてください。もし以前のバージョンの方がよかったってことがあれば、戻すこともできます。・・・が、できれば[極性判定デモ](https://mashup.apitore.com/social-sentiment/index.html)で現行バージョンの間違いをフィードバックしてほしいなと思います。


## 関連情報
- <a href="http://blog.apitore.com/2016/09/19/deeplearning4j-jwikipedia-word2vec/">deeplearning4jで日本語WikipediaのWord2Vecを作る</a>
- <a href="http://blog.apitore.com/2016/09/22/deeplearning4j-word2vec-limitation-and-application/">deeplearning4jのword2vecの限界とその上手な使い方</a>
- [deeplearning4jのdoc2vecで極性判定してみた](http://blog.apitore.com/2016/10/17/deeplearning4j-doc2vec-sentiment/)
- [deeplearning4jのdoc2vecにwikipediaのword2vecモデルを注入する](http://blog.apitore.com/2016/10/18/deeplearning4j-doc2vec-word2vec-injection/)
- [deeplearning4jでword2vecのベクトルデータからNNで極性判定してみる](http://blog.apitore.com/2016/10/19/deeplearning4j-word2vec-neuralnetwork-sentiment/)
- [deeplearning4jでword2vecのベクトルデータからRNNで極性判定してみる](http://blog.apitore.com/2016/10/20/deeplearning4j-word2vec-rnn/)
- [【API】日本語極性判定APIを公開しました](http://blog.apitore.com/2016/10/24/sentiment-classification-api/)
- [日本語極性判定技術のデモサイト作りました](http://blog.apitore.com/2016/10/25/ja-sentiment-classification-demo/)
- [deeplearning4jのRNNで極性判定を作った～Early Stop編～](http://blog.apitore.com/2016/11/01/deeplearning4j-rnn-sentiment-early-stop/)
- [deeplearning4jの極性判定でオンライン学習をやってみた](http://blog.apitore.com/2016/11/12/deeplearning4j-sentiment-online-learning/)
- [この記事のブログ版](http://blog.apitore.com/2017/05/15/sentiment-neutral-data-reinforcement/)
- [【アップデート情報】極性判定APIの精度改善](http://blog.apitore.com/2016/11/06/update-info-sentiment-api/)

## 極性辞書（レファレンス）

1. 小林のぞみ，乾健太郎，松本裕治，立石健二，福島俊一. 意見抽出のための評価表現の収集. 自然言語処理，Vol.12, No.3, pp.203-222, 2005. / Nozomi Kobayashi, Kentaro Inui, Yuji Matsumoto, Kenji Tateishi. Collecting Evaluative Expressions for Opinion Extraction, Journal of Natural Language Processing 12(3), 203-222, 2005.
1. 東山昌彦, 乾健太郎, 松本裕治, 述語の選択選好性に着目した名詞評価極性の獲得, 言語処理学会第14回年次大会論文集, pp.584-587, 2008. / Masahiko Higashiyama, Kentaro Inui, Yuji Matsumoto. Learning Sentiment of Nouns from Selectional Preferences of Verbs and Adjectives, Proceedings of the 14th Annual Meeting of the Association for Natural Language Processing, pp.584-587, 2008.