第2回 自然言語処理勉強会@東京

遅ればせながら 第2回 自然言語処理勉強会@東京 の感想。


まず、自分の発表「ナイーブベイズで言語判定」についていくつかフォロー。
長時間発表してしまって聞く方も疲れただろうに、いっぱい質問や意見をいただけたことを感謝。


「なぜナイーブベイズ? 他の方法は?」というところが比較的みなさん気になったようで、会場での質問もそのあたりにまつわるものが多かったと思う。
機械学習を実際の問題に適用する場合、唯一無二の解なんてもちろんどこにもなくて、様々なアプローチがあるわけだけど(それこそ論文の数くらい……)、エンジニアとして実用物を作るときのベストな選択は、「うまくいく方法の中で、一番シンプルで つぶしが効くもの」ではないかと思う。
って、当たり前のこと言ってるだけだけどね。
その点、ナイーブベイズはシンプルで つぶしが効くことは間違いないので、後はそれでうまくいきさえすればいい。じゃあ試してみよう! プロトタイプでうまくいった! 本番! という感じ。
もちろん、ここでうまくいかなかったら他の手法になってたかもしれない。多分ロジスティック回帰? SVM は「つぶしが効かない」と感じているので。
でも今回、他の手法についての提案をいろいろもらえたのはとてもありがたかった。n-gram 以外の特徴量も使うとか、ロジスティック回帰だと偏りもうまく表現できるのではとか、いろいろちょっと試してみたい気もするけど……うーん、手が回らないかなあ。


「ニュースでしかテストしてないの? 口語文は?」というのはおっしゃるとおり。
手元ではグループウェア掲示板のデータを使って(サイボウズ本社のチームによっては、英語/日本語/中国語などをちゃんぽんでやりとりしている)、口語文でもある程度いけるという感触は得ていたけれど、数字が出せるレベルでは行っていなかった。
本当は当然もちろん、さまざまなテキストソースでテストしたかったに決まってるわけだが、「そのあたりのテストデータ(しかも正解付き!!!)を集める作業までとてもじゃあないが手が回らなかった」というのがもうぶっちゃけた唯一の答え。
なにしろ、ニュースを使って49言語のテストデータ集めただけでも、今回の仕事で最も時間がかかっている部分なので……。
論文とか読んでいて「xx人の人手でannotationを付加したxx万件の正解付きデータを使って検証した」とか書いてあるの見ると、よだれ出る(苦笑)。


ありがたいことに、今回発表するやいなや ふぁぼったーの @ono_matope さんがTwitterストリームを言語判定させて検証してみてくださった。感謝。
正直、Wikipedia で作ったプロファイルだから、Twitter ぐらい崩れた(typoや短縮形も多い)口語だともう少し悪くなるんじゃあないかと危惧していたのだけど、@ono_matope さんの結果をみると、短い文章はやはりどうしても苦手だが、でもかなり健闘しているな、という「印象」。「Twitter 英語」コーパスでプロファイルを作れば、もっといい線行くんじゃあないかと夢が広がる……。


あと、overlast さんのブログに「資料に各作業にどれくらい時間をかけたのか、が書いてあると後で読んだ学生さんの参考になるかな」とあって、むむむ、と思い返してみた。
一番時間かかったのは、さっきも書いたように「テストデータ集め」(苦笑)。
資料には整理して書かれているが、一度に一つのことを、しかもきちんと体系的な順番で行っていたわけではもちろんなく、ウルドゥー語のニュースサイトを探し回りつつ、漢字クラスタリングの特徴量を試行錯誤しつつ、ロシア語の精度が悪いのを調べるためにブルガリア語やマケドニア語の分布と比較しつつ*1ペルシャ文字とデーヴァナーガリーを読めるようになるための書き取り練習しつつ、文字について調べているうちにいつのまにか Wikipedia で各国の歴史の記事を読みふけっている……みたいな。
明確にわかっているのは、Ruby プロトタイプに2週間(テストデータ集めと文字の正規化を一部含む)、Java 版(およびその他全て)に1ヶ月半、というところでしょうか……。役に立ちそうにないですね。


ちなみに、公開している言語判定ライブラリ for Java は、ひとまず精度向上は一段落して(もいいよね?)、API の確定とかドキュメントの整備とかテストコードを書くとか*2、そこらへんを鋭意作業中。

あずにゃんに関連する検索キーワード」→「あずにゃん ペロペロ」を実現するクエリ推薦技術について by @y_benjo さん
http://d.hatena.ne.jp/repose/20100925/1285399983

ここからその他の方の発表について。といっても、当日用事があって遅刻&資料が完成してなくて……(むにゃむにゃ)。
タイトルから誰もが想像するとおり、クエリ推薦についての2本の論文(MSR, google)の紹介。
つい先日 "A Large Scale Ranker-Based System for Search Query Spelling Correction"[Gao+ COLING2010] という、検索における「もしかして」機能の構築についての MSR の人の論文も読んだけど、このような結構めんどくさそうな推論があの短いレスポンスで行われているのかと思うと、ここに書いてないことがいっぱいあるんだろうなあと気が遠くなる……。


ただ、「研究できる会社が限られているので興味を持っても試せない!」というのは必ずしもそんなことなくて、よりユーザプロファイルの多い(IP アドレスとかそんな poor な情報じゃあなくて!)コンテキストでの推薦技術、というまた別の角度からのアプローチも考えに入れれば、例えばグループウェアを作っている会社とかはそういう技術を研究したい人材にきっと興味がありますよ、っと。

「Mozcソースコード徹底解説」 by @nokuno さん
http://d.hatena.ne.jp/nokuno/20100925/1285429764

ちょっと順番変えて。
Mozc は Google 日本語入力のオープンソース部分。つまり「結構めんどくさそうな推論が短いレスポンス&できるだけ少ないメモリで行われるための仕組みの実際」のお話。
11万行の C++ を本当に徹底解説したらきっと三日三晩では終わらない……。
Rewriter を使って学習機能を提供しているあたりとかすごく興味あるけど、正直理解が追いつかなかった(今資料を見返しても……)。スコアべた書きは好感度がw

FSNLP6章読みながら「nグラム入門」的なこと by @naoya_tさん
http://blog.livedoor.jp/naoya_t/archives/51478756.html

FSNLP6章には「ナイーブベイズで言語判定」でいろいろかぶるところがあったので、「さきほどの naoya_t さんの発表であったと思いますが……」と何回かやらかしたら、実は smoothing の部分はカバーしてなかったという。
聞いてなかったことがモロバレすぎる(汗)。すいません、「みんな大好き Jane Austen」のところでようやく会場に到着しました。Jane Austen はもちろん好きです。
「3-gram に勝つのは意外に難しいよ」はホントそう思います。

Malettを使ったLDA by @tsubosaka さん
http://d.hatena.ne.jp/tsubosaka/20100925/1285424360

Mallet はこの前の PRML 最終回でも、ちらっと教えてもらってたので興味は持っていたが、この後でさらにいろいろ細かいところを聞いてみると、Instance というデータコンテナ的なもの(?)が抽象化のためにメンバを java.lang.Object で持っていて、実際にモデルに食わせたときにキャスト違反例外が出る(!!)、求められている型を知るにはコードを読むしかない……というのを聞いて、ちょっと萎えた。
なんだろう、インクルードガードを書かないくらい筋悪みたいな?

まとめ?

自然言語処理は全くの専門外なので、こういう勉強会の存在だけでもありがたい&発表するとフィードバックももらえちゃう、ということで今後も参加させていただきますんで、よろしくです。
次回は、多分持ちネタが無いと思うので、何か新しめの論文読みをしようかな、と。

*1:今回の資料にはもう書ききれなかったが、この3言語も結構判別に苦労した

*2:ええ、はい、レガシーコードですが、なにか?