Hatena::ブログ(Diary)

武蔵野日記 このページをアンテナに追加 RSSフィード

2009-03-27

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

自然言語処理は Python がいちばんを含むブックマーク 自然言語処理は Python がいちばんのブックマークコメント

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

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

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

Natural Language Processing with Python

という本も出る(ドラフトは上記 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 を公開しましたで書いた Java の API。自然言語処理で最近よく使われる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 言語しか触ってきていないそうだが)。

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

icloudicloud 2009/03/29 16:07 前々からRSS購読させてもらってます。
最初の遊び相手に選んだpythonと興味があった自然言語がくっついて、大変お得になりました。
各言語が各分野でどういう位置づけにあるのかを一度まとめてみたいなあ・・

shimashima 2009/03/29 19:10 ご紹介ありがとうございます!
Google で働く人は Python 派の人が多いと思って調べたら、オフィシャル言語なんだそうです。

> At Google, python is one of the 3 "official languages" alongside
> with C++ and Java. Official here means that Googlers are allowed
> to deploy these languages to production services.
http://panela.blog-city.com/python_at_google_greg_stein__sdforum.htm

そういえば、Google App Engine は現在 Python のみサポートで、これから Java に対応するそうで、同じような傾向ですね。ちなみに私の周りは Java 派ばっかりです。

mamorukmamoruk 2009/03/30 00:14 >>id:icloud さん
いつもお世話さまです〜

分野によって使う言語は違いますね。機械学習だと Matlab (Octave) が勢力ありますし、統計に近くなってくると S (R) もありますよね。どんな言語を使えばいいってのは、自分しか参加しないプロジェクトだったらなんでもいいですし、他の人が参加するプロジェクトでも自分が発起人だったら影響力行使できるので、好きな言語使えるなら使えばいいんじゃないかと思っています。

まあ、自然言語処理では Python が(ユーザ数が多いので、C で書かれたライブラリのラッパーもたくさんあるし、コードも大量に生産されているので)使いやすいだろう、というだけであって、適材適所なんじゃないでしょうか……?

>>shima さん
そうですね、Google は Python でデプロイしていいという話は聞いたことあります。Python はいろいろなところでバランス取れているいい言語だなとは思いますが、速度は確かに(そんなに遅くないというだけであって)もっと速い言語もあるでしょうし、Java は Java で膨大なユーザを抱えているのでサポートされるとインパクトあるでしょうね。

個人的には Java より C# のほうが好きですが、やはり使える環境がかなり制限されるのがネックですよね……(あとやはり機械学習のライブラリやツールキットは Java が充実していますし)。

くどうくどう 2009/03/30 01:54 個人で研究するとかならいいですが、グループワークとか自分の成果を他人に使ってもらいたいとかオープンソースで公開するのであれば、中立性から考えて C/C++ のほうがいいと思います。perlやruby からpythonを呼ぶんなんてキモイです。mecab が python で書かれていたら、Mac や iphone にはのらなかったでしょう。

しましましましま 2009/03/30 10:09 実現するでしょうか? http://www.procoders.net/?p=419
pythonは numpy と scipy の存在が大きいような気がする.

mamorukmamoruk 2009/03/30 22:36 >>くどうさん
コメントありがとうございます。その通りですね。他の言語から呼ばれることを考えるとそういう意味では Java も候補から外れると……。自然言語処理のプログラムって、木にたとえると幹というよりは葉っぱの部分のプログラム(そこから派生するプログラムがない場合)が多いので、Python や Java で、となる人が多いのかもしれません。全部の and を取ると C++ が残りますね。(それも妥当だと思います)

>>しましまさん
ええ、NumPy と SciPy は大きいです。自分も SciPy がなかったらこんな Python が使えると思っていなかったかもしれません。(せいぜい Perl 並、と思っていたかも) SciPy があるので、自然言語処理とか機械学習とかそっち系の研究するのはやりやすいですね。

あと Python が C++ とか Java とかと競合するのかというとたぶんそういうことはなくて、以前であれば Fortran とか Lisp (Prolog?) が担っていた役割の一部を Python がカバーしてくれるので、けっこう使われるようになってきたのかなと思います。Perl では力不足だったけど……。