変なサービスを作るのが好き

頑張ったことを報告するブログ

機械学習分類器が載ったモバイルブラウザを作った話

はじめに

半年ほどかけてアプリのプロトタイプを製作したので、開発の動機や使用したツールなどをまとめてみる。

作ったものはページを自動分類するモバイルブラウザでWWDC2017で発表されたCore MLを使用している。

機械学習を用いたサービスを製作したのは初めてだったけれど、scikit-learn等のライブラリやgoogle custom search等のAPIが充実しているので比較的容易に開発を始めることができた。しかしパラメータの設定等まだまだ試していないことが多くあったり、教師データの質と数の問題から分類の精度は現時点であまり良いものではない。

しかし、精度を向上する仕組みなどを取り入れているので今後の改善に期待して欲しい。

 

開発の動機

友人と会った時、この漫画が面白いとか、あの映画が面白かったとかそんな話しをよくする。
後でそのコンテンツを読みたい、観たいと思ったものを忘れないように記録するようにしてから、面白いコンテンツに出会う機会が多くなったと思う。

ブックオフでバイトしている友人の勧める漫画は面白いし、映画を撮っていた友人の勧める映画は面白い。
他にもテレビや、Web、ポッドキャストなどで興味深いコンテンツを紹介される機会が多い。

そんな中で色々な方法で記録をしてきた。例えば、
自分だけのライングループに記録する。iPhoneのメモアプリに記録する、Todoアプリに記録する。Evernoteに記録する。
このような方法で記録してきたけど、レビューを見たり、ネットで注文したり、そもそも漫画だったのか、映画だったのか調べるために、Safariを開いて検索することが多かった。
なので、最初からSafariで検索してそのタブを残してメモ帳代わりにするようになった。
この方法だと、テキストに紐付いた情報が検索結果に表示されるので振り返りやすいし、レビューを読んだり注文したりその先の行動がスムーズなので気に入ってた。
しかしタブの数が増えてくると、様々なジャンルのタブで混じりあっていて振り返り辛くなっていた。
標準のブックマークはフォルダ分けが面倒で続かない。
もっとインスタントに保存と仕分けができる方法が欲しかった。

 

日頃の生活で気になったものはとにかく記録しておく。

休日の暇な時間にアプリを立ち上げ貯めておいたコンテンツを楽しむ。

自分でカテゴリごとに分類する必要はなく、勝手に整理してくれる。 そんなサービスを自分の手で作ってみたいと思った。

SwiftもPythonも初心者だったけどチャレンジしたいと思って開発を始めた。

半年間程作業してようやくプロトタイプを出すことが出来た。

 


アプリの紹介

作ったアプリは「ページを自動で分類してくれるブラウザ」 

f:id:maltz8:20180217092900p:plainf:id:maltz8:20180217092908p:plainf:id:maltz8:20180217093013p:plain

 

 

現時点では「やりたいコンテンツをメモするアプリ」というコンセプトなので、Web上のすべての記事を網羅するような種類のタグは用意されていない。これからもタグの種類は増やしていきたいが、タグが多すぎると逆に不便だと思うので慎重に追加したい。

このアプリは友達と2人で開発していて、主に僕がクライアント担当で、友達が機械学習系と、バックエンドを担当している。

その際使用したツールや、参考にした資料を以下に記載させてもらいます。

 

アプリを開発するにあたって使用したツール

Core ML

WWDC2017で発表されたCore MLの存在を知ったのも開発を始める上での大きな動機となった。
Core MLはiOS11から使用できる機械学習のライブラリで、PCで作成した機械学習の分類器をiPhone上で動く形式に変換してくれる。(iOS11がインストールされた端末でしか動作しない)例えばPCで作成した画像分類器を端末上でスタンドアローンで動かせるようになる。
本来なら、複雑な処理を書いて端末上で動かすか、サーバー上にデータを送信して分類させていたものが簡単に機械学習の機能が搭載したアプリを作成することができるようになった。
CoreMLを用いれば閲覧しているページをサーバーに送信すること無く、プライバシーも守られ、リアルタイムで分類できる。

 

Google Cloud Natural Language API

とは言え文章をカテゴリごとに分類する機械学習を用いた分類器を作成するのはある程度時間がかかる。分類機能を提供するAPIがあったらまずそれで試したいと探してみると、Google Cloud Natural Language API に9月からカテゴリ分類の機能が追加されていた。
しかし日本語の文章は対応していない。swiftで簡単なブラウザアプリを作成し、evaluateJavaScriptを用いてページの本文を抽出して、翻訳APIを噛ませた上で分類APIに送信してみた。ここに記された720のカテゴリに自動で分類してくれた。しかし、価格が高く、判定までの数秒程時間がかり(翻訳APIを間にリクエストするため)、データを外部に送信するため、自前で分類機を作成することに決めた。
ただ、ページを自動でカテゴリに分類する機能の利便性について確認できたので、始めのプロトタイプとして試して良かった。

 

自動分類の精度改善の仕組み

教師データの数と質に問題があって、現時点での精度はあまり高くない。
このアプリは閲覧しているページをサーバーに送信せず端末上で分類しているので、普通のブラウザと同じように匿名性を保ったまま使用できるが、設定画面の「自動分類の精度向上に協力する」にチェックを入れると、ユーザーが手動で分類結果を修正した情報がサーバーに送信される仕組みになっている。(例えば、本と判定されたが実際は映画であり、ユーザーが映画と修正した情報。またはその逆)このデータで分類器の精度を向上させたい。
また、日本語より英語の文章の分類の方がハードルが低そうなので分類機をローカライズして配信してみたい。


特に参考になった資料

swift

Start Developing iOS Apps (Swift)
google翻訳Chrome拡張を使いながらアップルのチュートリアルをやって分からないことを下の参考書を読みながら進めるのが分かりやすかった。

詳細!Swift 3 iPhoneアプリ開発 入門ノート Swift 3+Xcode 8対応

 

WKWebviewで簡単なwebViewを作成する - Qiita

WKWebViewでブラウザを実装するのだが最初の導入で参考にした。 


mozilla-mobile/firefox-ios
WKWebViewのデリゲート内の処理の仕方等、とても参考になった。実際に運用されているプロダクトでのswiftの書き方が知れて良かった。

 

Natural Language Processing in iOS – martinmitrevski

SwiftでNLPする時のチュートリアルとして参考になった。

 

Share Extensionでデータを共有する - Qiita

Queは一応ShareExtensionに対応している。Twitter等から共有ボタンで追加できるようになっている。

 

Core ML


Core MLは画像分類の資料はたくさんあるけれど、それ以外はなかなか見つけづらいので、「core ml linear regression」等の検索ワードで出てくるチュートリアルを試すのが手軽にコツを掴めて良かった。

Machine Learning in iOS Using Core ML

GitHub - likedan/CoreML-Linear-Regression: Core ML verson of Scikit Learn Linear Regression Examples


機械学習

MeCab, gensim, scikit-learnでニュース記事の分類 - Qiita

自然言語処理における前処理の種類とその威力 - Qiita

scikit-learnとgensimでニュース記事を分類する - Qiita

とても良かった

https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-Willi-Richert/dp/4873116988
この本ではpythonのscikit-learnを使って分類器や線形回帰を作成するので、core ml toolsで変換してiosアプリにすると、swiftとpythonどっちも学べて楽しかった。