※この記事はすでに内容が古くなっています。こちらをご覧ください。

いい話判定器を作った。

いい話判定器
http://goodstory.id774.net/goodstory/

テキストを入力するかコピー&ペーストすると、いい話かどうか判定してくれる。

アルゴリズム

基本的に単純ベイズ分類器 (= ナイーブベイズ) そのままである。形態素解析エンジンで自然言語処理をして教師あり学習する。蓄積された教師データと呼ばれる知識により機械学習をおこない、入力データを分類するところに特徴がある。

ナイーブベイズは例えばスパムメールの分類に利用されるアルゴリズムである。人間が見るとスパムメールの判別は一目瞭然であるが、これを人力でおこなうとなると大変に不毛な作業となる。そこで機械にスパムメールのパターン認識をさせ、自動的に処理することにより恩恵を得ることができる。

実装

分類器本体は数学関数ライブラリ自然言語処理ライブラリの豊富な Python で実装、ビューとコントローラー部分を Ruby on Rails で実装している。統計学の分野ではメジャーで優れた言語である Python と、非常に柔軟な言語 Ruby のそれぞれのいいとこ取りを狙った組み合わせだ。オブジェクト間の通信には RubyPython を利用している。単体のテストは nose 、結合試験には RSpec を利用し Ruby で Python とのメッセージングが正常におこなわれていることを確認した。

ハマった点など

Ruby と Python を併用するにあたり最も鬼門となるのが文字コードの問題である。これに関しては要所々々でひたすら UTF-8 へのエンコードを強制して対応することになるのだが、心がけていても実に様々な問題の起こりやすいポイントなので、設計の段階で疎結合にしておいたほうが無難である。今回の実装では ActiveRecord で保存したデータを SQLAlchemy で読み取ったり、引数と戻り値のオブジェクトを RubyPython の有効な空間でおこなう必要があったりと、いくつかの結合のポイントがあって毎回問題に突き当たってしまった。

学習

一言で言うと誰でも訓練できる単純ベイズ分類器なので、賢い判定ができるかどうかは教師データに拠るところが大きい。そこでインターネットで誰でも訓練できるようにした。また、公開直後に追加実装していい話の閲覧も可能なようにした。ぜひ心あたたまるいい話で分類器を訓練して、レベルアップさせてみてほしい。

投稿日: 作成者: 774