自然言語処理は Python がいちばん

現在大学1年生の人で3年後には NAIST に (というか松本研に) 来たいという人から「どんなプログラミング言語やっておくといいですか」と質問されたりするのだが、なかなか答えるのは難しい。自分は PerlPython がメインでときどき C++/C# を使ったりするのだが、どれが一番いいかはなんとも言えないので、自然言語処理以外に転向する可能性も考えると、C とか C++ とか Java とか(授業でそちらをやるのであれば)を最初の武器に選んだ方がいいのでは、と思ってはいる。

そんなこんなで最近 Hal Daume III (機械学習を用いた自然言語処理では非常に有名な人) のブログで Language of Choice というタイムリーなエントリーが出ていたので、紹介すると、「それなりに大きな自然言語処理のプロジェクトでどのプログラミング言語を使うのか」というアンケート結果が出ている。

要約すると、PythonJava と C/C#/C++/Objective-C (このくくりは他の人も指摘していたが確かにどうかと思う) がほぼ同じくらいの票を獲得し、4位以下を大きく引き離してトップ3。だいぶ離れて Perl、少し離れて RubyMatlab (これは彼のブログを読むのが機械学習寄りの人が多いというせいだと思う)、あとは R とか Lisp とかがぼちぼち、といった感じ。

スクリプト言語的には自然言語処理では Perl が伝統的に強く、Python はここ10年で一気に増えてきた感じなのだが、逆転するほどとは思っていなかったので、個人的には意外だった。ただここ数年でリリースされる自然言語処理ツール、C++Java でなければまず Python であることがほとんど (従来のスクリプトを手直しするのはまだまだ残っているが、新しく書かれるプログラムとしては、Perl で書かれるスクリプトはかなり根絶気味である) なので、抜かれるのは時間の問題だとは思っていたが……。

Python からはさまざまな (C とか Fortran で書かれた) ライブラリも呼べたりして速度的にもそんな遅くなかったり、それなりに書きやすかったり、以前 Perl を使っていた自分は「インデントで構文が決まるなんて変態的」だと思っていたが、食わず嫌いはやめようと思って使ってみたら意外とよくて、Python でグラフ・(疎) 行列計算するためのライブラリを紹介するよで書いたように、そのまま現在ではメイン言語になっている、という感じ。

特に Python自然言語処理と親和性が高く、教育用の自然言語処理ツールキット nltk (Natural Language Toolkit) も Python で書かれている。

Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit

Natural Language Processing with Python: Analyzing Text with the Natural Language Toolkit

という本も出る(ドラフトは上記 nltk のサイトからダウンロードできる)し、

Text Processing in Python

Text Processing in Python

という本もある(こちらの内容は著者のページからダウンロードできる)し、勉強するにはそんなに困らないとは思う。(日本語の情報は少ないので英語で情報を得ないといけないのはハードル高い人もいるかもしれないが、少なくとも研究の世界では英語で情報を得るのは避けて通れない道なので……) ちなみに後者の本はすでに内容が古くなりつつあるということと、あまり親切な本ではないので、買いたい場合はちゃんとドラフトを見てから買った方がいい。

とここまでが前振りでここからが本題。

英語ではプリンストン大学で作っている WordNet というシソーラスが無料で公開されていて、この辞書がかなりすごくて言葉の意味を扱うような自然言語処理タスクではこれを入れるか入れないかだけで精度が10%くらい変わるのは珍しくないのだが、これの日本語版の登場がずっと待ち望まれていて、とうとう2月に日本語 WordNetとしてリリースされた。元々英語版をベースとしていることによる問題もあるようだ(日本語ではサ変名詞とか英語とちょっと事情が違う単語もあるので)が、ひとまず使えるようになったというのはかなり大きい。

それで、これがリリースされたと聞いてまず日本語 WordNet を使うクライアントを書いたのが @yanbe さん。日本語WordNetのデータベースを探索するフロントエンドプログラムとして公開されているのだが、こちらのプログラムは Python で書かれている。yanbe さんの話では、以前 UC Berkeley との共同研究で英語版の WordNet を使っていたので日本語版をさくっと作ることができた、という話だが、やはりお手軽にクライアント書いたりするのは Python が一番便利なんだろうな、と思う。

一方、次に見たクライアントは CMU の shima さんが日本語 WordNet の Java API を公開しましたで書いた JavaAPI自然言語処理で最近よく使われる3大言語のうちの2つがすぐに登場したということで、やっぱりトップ3はよく使われているんだろうな、という印象。Java自然言語処理でもそれなりに使われているし、機械学習のツールキットがたくさん出ている (たとえば Weka とか Mallet とか)ので、機械学習的な自然言語処理に興味がある人は、Java も使いやすいとは思う(修士で就職する場合も考えると、特に……)。

調べてみたらRuby 版のフロントエンドも Python 版と同じくらいの時期に登場していたようで、やはりいわゆる LL (Lightweight Language) なら手っ取り早く書くのは楽なのかなとは思う。ちなみに Perl 版はデータと同時に開発者の Bond さんがリリースしている(上記の日本語 WordNet の元サイトからWordNet::Multi がダウンロードできる)。

というわけで、これから自然言語処理を始めようという人は、他の人のコードを参考にしやすいという意味でも、いろんなライブラリが充実しているという意味でも、上記トップ3 (Python, Java, Cの兄弟) の中から選ぶといいんじゃないかと思う。なおかつ、Google新卒採用では「C、C++ または Java のいずれかにおけるプログラミング知識」、中途採用では「C++ または Java における開発経験」とあるので、C の兄弟といってもどれかという意味では C++ がいいだろうし、Python だけでは自然言語処理以外に行くとき大変だと思うので、そのあたりも考慮しつつ決めた方がいいだろうけど……。

(2013-07-13 追記) その後首都大学東京 (旧都立大) に来て 自然言語処理の研究室を新しく立ち上げた のだが、自然言語処理機械学習Python が使われる機会は、この記事を書いた4年前と比べてさらに増えている。新しい研究室で半年かけて自然言語処理の基礎的なアルゴリズムを実装するチュートリアルを開催しているが、ここでも Python を指定している (首都大の情報系は「情報通信コース」に属するので、授業ではほとんど C 言語しか触ってきていないそうだが)。

基本的に状況は変わっていないが、ScalaClojure などの Java VM 系の言語で書かれた自然言語処理ライブラリ・ツールが増えてきた、というのが4年前と比べて変わってきたところだろうか。(個人的には、これらの言語がスタンダードになることについては懐疑的であるが、研究で使うには便利である。)