11/27-28 に京都で開催された WebDB Forum 2013(第6回 Webとデータベースに関するフォーラム) の、サイボウズの技術報告セッションにて「どの言語でつぶやかれたのか、機械が知る方法」という題で発表させてもらいました。聞いて下さった方(ustream 中継含む)、関係各位、ありがとうございました。
発表資料はこちら。
テーマは過去に発表済みの「∞-gram ロジスティック回帰を使った短文言語判定」なので、技術的に目新しいことは特にない。実装が新しくなったり、細かい工夫はちらほらなくもないんだけど、そのあたりは基本端折ってしまったし。20分ちょっとの発表時間でモデルの話をすると大火傷を負うことは身にしみてわかっちゃったんだ……。
というわけで、「twitter やチャットといったネット上の informal な場で、諸言語が正書法からはみ出しまくっている様子」を中心にお話しした。それでも20分だとやっぱりショートバージョンになってしまうんだけどね。なんなら一時間でも二時間でも話せてしまうんだけど、モデルの話と違って途中で打ち切られても問題ないw
twitter や facebook などにあふれるテキストを使って、日本語なり英語なり、特定の言語だけを対象としたサービスや研究だけではなく、多言語をターゲットとしたものを考えるなら、今回のような話は知っておいて損はないと思う。
もともとの言語判定器は ldig という名前で公開しているのだが、こちらは扱いとしてはプロトタイプ版であり、API 的なものは整備していない。
実装も Python で、学習にまる1日かかるていたらく。
そこでぼちぼちと C++ 版を実装していたのだが、今回の発表に合わせてとりあえず最低限の体裁を整えてリポジトリにコミットしておいた。しかしドキュメントもまだないし、学習済みモデルも x64 ビルド用しか付いていない(size_t をそのまま吐いているので、プラットフォームによってフォーマットが違ってしまっている)。
ビルドは今のところ Windows のみで、 Visual C++ 2010 用のプロジェクトファイルが付いている(C++11 をちょいちょい使ってるので、それより前の VC ではビルドできない)。gcc on Linux でも微調整で通ると思うが、手を付けてない。ごめん。
なおビルドには cybozulib が必要なので、以下のリポジトリから ldigcpp のディレクトリ下にチェックアウトする必要がある。
岡野原さんの esaxx も必要だが、こちらは ldigcpp のリポジトリに同梱させていただいている。
というわけで、現状では余程の物好きでなければ手を出す気にもならないと思うが、ゆるゆると整備していく、かもしれない。
元の python 版 ldig と比較しての第一の変化はやはり速度だろうか。まる1日かかっていた学習が、20分で完了する。この速度ならパラメータを色々変えて実験してみたり、アホみたいに cross validation 回しまくったりできるので、やはり速いは正義と実感。
もう一つの変化は、ラテン・アルファベット以外の言語にも対応したこと。リポジトリにある学習済みモデルは、以下の50言語に対応したものとなっている。
- アラビア語, Arabizi, ブルガリア語, ベンガル語, カタルーニャ語, チェコ語, デンマーク語, ドイツ語, ディベヒ語, ギリシャ語, 英語, スペイン語, エストニア語, ペルシャ語, フィンランド語, フランス語, グルジア語, ヘブライ語, ヒンディー語, クロアチア語, ハンガリー語, インドネシア語, イタリア語, 日本語, 韓国語, リトアニア語, ラトヴィア語, マケドニア語, マラヤーラム語, モンゴル語, オランダ語, ノルウェー語, パンジャーブ語, ポーランド語, ポルトガル語, ルーマニア語, ロシア語, シンハラ語, アルバニア語, スウェーデン語, タミル語, テルグ語, タイ語, タガログ語, トルコ語, ウクライナ語, ウルドゥー語, ベトナム語, 中国語(簡体字), 中国語(繁体字)
特に Arabizi(とは何かについては発表資料参照) やモンゴル語(キリル文字表記)は Google 翻訳や Choromium の言語判定器も対応していないので、超ごくごく一部の人には値打あるのでは。精度はまだちょっと低いのだけどね。
本当はバスク語やガリシア語やスロバキア語やスロベニア語やネパール語やマラヤーラム語や……なども用意していたのだが、さすがにツイート100件にも満たないのは除外した。
必要な 50言語コーパスは以前の ldig で作った 50万件は一部のみ再利用したが、40万件(訓練)、7.6万件(テスト)を基本新しく作りなおした。なぜそのまま再利用しなかったのかというと、旧コーパスの大部分は twitter のステータス ID を捨ててしまっていたので、配布できる形式ではなかったからだ。
今回の新コーパスは全部ステータス ID が付いているので、(ステータス ID, 言語ラベル) の組で配布できる。
が、ステータス ID から実際のツイートを取得するにはそういうスクリプトを書かないといけないんだけど、自分にはそれ必要ないので、用意する動機がない。スクリプト無しでデータだけ配布してもいいんだろうけど、そしたら「開いたら数字しか書いてないんだけど、どうしたらいいの?」というメールとツイートと issues への書き込みが確実にやってくる(苦笑)。
というわけで、こちらもそのうちおいおい。
ちなみに、twitter には API 呼び出し回数のキャップ(15分180回)があるので、40万件を取得するには約23日かかる。まあこういうのを必要としている人はそれでも全然いいから欲しいと言うだろうけど。