ナイーブベイズ分類器のScalaライブラリを公開しました(Javaの移植)
こんにちは、@s_tsukaです。
今回はとあるライブラリを開発・公開した話です。
開発・公開したライブラリはこれです。
https://github.com/tsukaby/naive-bayes-classifier-scala
ナイーブベイズ分類器ライブラリです。
ナイーブベイズ分類器
ナイーブベイズは教師ありの機械学習の手法の1つです。自分は機械学習は全くの専門外なので間違ってるかもしれませんが。
以下が分かりやすく丁寧に解説されていて助かりました。
簡単に言うと「このメールはスパムかどうか?」とか「この文章はどういうカテゴリなのか?」というようなことを導き出すためのアルゴリズムです。予め、「こういう単語があるとスパムだよ」とか「こういう単語があると政治カテゴリだよ」とかを教える(教師データを用意する)ため、教師ありの機械学習です。
今回はこのナイーブベイズをScalaで使うためライブラリを開発・公開しました。とは言ってもすでにJavaにあるMITライセンスライブラリの移植です。
移植元
https://github.com/ptnplanet/Java-Naive-Bayes-Classifier
Javaで書かれています。一部のI/Fがちょっとだけ扱いづらかったのでScalaコードに移植して違和感なく使えるようにすることを目的としました。
また、移植元はMavenに公開されておらず利用しづらかったため、自分の方ではMavenリリースまで行いました。
Scalaでnaive-bayesは他にも
https://github.com/arnaudleg/naive-bayes-classifier-scala
これなどがありますが、これもMavenにリリースされておらず、またTokenizerが内包されていて日本語対応するのが難しそうでした。そういう経緯もあり今回自分で移植して作りました。
使い方
全てここに書いてあります。
https://github.com/tsukaby/naive-bayes-classifier-scala
このあたりが良くできているのは移植元のJava versionを開発したptnplanetさんがすごいからですね。
使い方補足
上記ライブラリのREADMEの使い方を読んだ方で「単語の一覧とその答え(カテゴリ)を学習させるのは分かったけど、単語の一覧をどうやって作るんだよ・・・」と思った方も居るかと思います。
学習データをどう用意するか(どうモデルを作るか)は機械学習の重要なポイントのようで、残念ながら門外漢の私にはうまく回答できません・・・。
ですが、とりあえず以下のような方法があるかなと思っています。よろしければ参考にしてみてはいかがでしょうか。(ちなみに自分はテキストのカテゴリ分類を前提に考えています)
- Q. 学習対象あるいはテキスト分類対象のテキストが日本語文章であり、うまくライブラリが動かない。ライブラリは配列を要求しているが、どう配列を与えるか分からない。 A. 分かち書き、ということを行う必要があります。Java/Scalaユーザであればkuromojiというライブラリを使うと良いと思います。日本語文章を適切な単語ごとに区切ってくれます。
- Q. 学習データの質が重要だと思うんだけど、どうやって集めたらいいかわからない。 A. 自分も知りたいです。世の中のWebページをクロール&スクレイピングして、それに対して答えを人が与えてやる、とか。有力なWebサイトに行って、タグの一覧を取得して、そのタグ一覧に回答を与える、とか。
まだまだ機械学習は1%も勉強していない状態ですが、このナイーブベイズを足がかりに色々学んで行きたいと思います。
とりあえず頭良い知り合いに聞いた所PRMLという本から勉強を始めると良いらしいです。
・・・が、これは大学数学の知識が必要なレベルで入門にはかなりキツいです(会社にあったので少し読んだ)
[tmkm-amazon]4621061224[/tmkm-amazon]
[tmkm-amazon]4621061240[/tmkm-amazon]
色々難しいですが、まとめるとライブラリをScala用に移植してMavenにリリースしました!良かったら使ってみてください。(良いねと思った人はStarください・・・!)
https://github.com/tsukaby/naive-bayes-classifier-scala
追記:他の機械学習Scalaライブラリ
会社の同僚に「Spark内には機械学習のライブラリが揃ってるのに、Sparkは最低でもStandaloneのSparkクラスタが必要なので、ちょっとハードル高いんですよ」と相談したら「じゃあSpark内で使ってるBreezeってライブラリ使ってみたら?」と教えていただきました。
ScalaNLPというプロジェクトがあって、その中の一ライブラリのようです。
Breezeは数値処理と機械学習のためのライブラリで、今回のNaive bayesのようなアルゴリズムというよりはそれの処理を書くための便利メソッドを集めたような感じのライブラリです。
Nakというライブラリもあって、内部ではBreezeが使われています。Nakの方はもうちょっと高レベルでNaiveBayesもありました。
https://github.com/scalanlp/nak/blob/master/src/main/scala/nak/classify/NaiveBayes.scala
他にもk-meansとかもありますね。
作っといてなんですが、自分のライブラリを使うよりはこっちを使った方が良いかもしれませんね。