はじめに
概要
AWSLambdaを用いて、形態素解析・ネガポジ判定を行いました。
さらにそれを呼び出すChrome Extensionを作りました。
動作
Extensionを実際に実行している動画です。
https://youtu.be/-WW9-FS14iU
リポジトリ
筆者について
AWSと機械学習は初心者です。この記事にも色々とツッコミどころはあると思いますが、もしあったらコメント欄で優しく教えてもらえれば幸いです。
環境
MacOS HighSierraです。
データを集める
スクレイピング
BeautifulSoupを使ってAmazonレビューのデータを集めました。注意点として、相手のサーバーに負荷を掛けないように時間を開けて実行してください。今回は3秒に1回にしました。
データ分析
参考にした記事
https://qiita.com/takumi_TKHS/items/d5131e08f0b4e36eed13
Fasttextを使って、5段階に文章をクラスタリングしました。(__label__1, ... , __label__5)
データをいじる(精度の改善)
レビューの分布を見てみると、星5のレビューが多く、星2のレビューが少なかったので、全体を星2のレビューの数に合わせました。
精度ログ
日付 | データ名 | 二乗平均誤差 | 備考 |
---|---|---|---|
20190520 | train-1.lst | 3.1810502601128867 | データを均していない |
20190520 | train-5.lst | 3.5173455561196736 | 全ての品詞 |
20190520 | train-6.lst | 2.7260113494692706 | 動詞のみ |
20190520 | train-7.lst | 2.2812438853609276 | 形容詞のみ |
20190520 | train-8.lst | 2.196664765267606 | 形容動詞のみ |
20190520 | train-9.lst | 2.028354813214697 | 名詞のみ |
20190520 | train-10.lst | 2.2340274200386463 | 副詞のみ |
20190520 | train-12.lst | 2.175985237169445 | 連体詞のみ |
20190520 | train-13.lst | 2.2264072902013634 | 感動詞のみ |
20190520 | train-14.lst | 2.3114062619249776 | 助動詞のみ |
20190520 | train-15.lst | 3.0844580552161402 | 助詞のみ |
データを均し、取り出す品詞を変えながら実験しました。
AWS
制限対策
最初はPythonで書かれたバージョンのFasttextを使ってEC2上で動かしてみたのですが、メモリ制限に当たってしまい、上手くは行きませんでした。そこで、fasttext-serverlessというあらかじめ整備された物を使ってみました。
https://github.com/CareerVillage/fasttext-serverless
pipインストール
https://qiita.com/bukaz/items/c5d65109c20b32b7f5ca
dockerizepipを使いました。内部的にDocker(Lambci)を動かしています。pipを使うだけで十分であればこれで大丈夫です。
インストールしたライブラリ
- janome : pipでインストールできる日本語の形態素解析では軽いです。
Docker上で学習させる
改行コードのなどの問題があったため、AWSの環境を再現したDockerの中で学習させて、モデル(.binファイル)を取り出しました。
詰まったこと
Dockerの中からファイルを取り出せなかったので、https://blog.amedama.jp/entry/2018/01/30/221546 を参考に学習済みモデルを取り出しました。
エクステンション制作
Messaging
Chromeでバックグランドで動いているjsとポップアップ上で動くjsの間で通信をする必要があり、
Github上でMessagingを使っているエクステンションを検索して、参考にしながらMessagingを実装しました。
https://github.com/rmango/msgPassingExample
CORS
ローカルのWebからアクセスするためにはCORSの問題を解決する必要があるので、バックエンド側でHeaderをつけてあげる必要があります。
文字コード
POSTを送るときに、日本語を送ると文字化けしてしまったので、一旦encodeURI()
を使って文字コードにしてあげて送ると良いです。
おまけ
Native messagingについて
Chrome ExtensionにはNative Messagingという機能があり、ローカルに存在するファイルを実行する機能がありますが、権限を与えてもChrome側の仕様によって、subprocessが実行できないのでダメでした。確かにこれをアリにしてしまうとChromeからローカルの任意のコマンドを実行できるのでとても危険ですね。。。(これで1ヶ月溶かしました)
備考
後々記事はアップデートする予定です。