現在、文学機械を作るという使命感の元、自然言語処理を勉強するべく『入門 自然言語処理』を紐といています。
[429] [429] Client error: `POST https://webservices.amazon.co.jp/paapi5/getitems` resulted in a `429 Too Many Requests` response: {"__type":"com.amazon.paapi5#TooManyRequestsException","Errors":[{"Code":"TooManyRequests","Message":"The request was de (truncated...)
基本的にはPythonのNLTK(Natural Language Tool Kit)を使いながらお勉強していくのですが、この本の第七章でつまづいたので、シェアしておきます。ちなみに僕の環境はMac OS X 10.7.3でPythonはMacportsで入れた2.6、NLTKも同じくMacportsで入れました。
MegaMとか言われる
自然言語処理にまつわるアルゴリスムの紹介を読んで感心しつつひたすら写経していくのがこの本の読み方なのですが、普通に進めていると、第七章 7.3.3でエラーが発生。MegaMが入ってねーぞとか言われます。
=========================================================================== NLTK was unable to find the megam executable! Use config_megam() or set the MEGAM environment variable. >>> config_megam('/path/to/megam') For more information, on megam, see: <http://www.cs.utah.edu/~hal/megam/> ===========================================================================
MegaMってなんやねんと思って調べると、NLTKのページに小さく書いてあります。エントロピーを計算するときのライブラリのようですね。
MegaM: http://hal3.name/megam/megam_src.tgz (requires ocaml; edit Makefile to set WITHCLIBS to point to location of ocaml .h files; locate these using macports with port contents ocaml, install megam binary, e.g. to /usr/local/bin and set MEGAMHOME to point to this directory).
え、こんどはocaml(…おかむら?)が必要らしいです。言われるがまま、macportsでインストールします。
sudo port install ocaml which ocaml # /opt/local/bin/ocaml
ちょっと調べてみたところ、ocamlは「オーキャメル」と読むらしいです。
さて、言われるがままMakefileを編集します。./configureじゃない時点で僕はもうなにがなんだかわからないのですが、唯々諾々と従います。
cd ~/Applications wget http://hal3.name/megam/megam_src.tgz tar xzvf megam_src cd megam_0.92 vim Makefile
NLTKのサイトに書いてある通り、WITHCLIBSをocamlのヘッダーファイルが入っているフォルダに直します。macportsで入れたやつは普通のUnix系とは変わってしまうので、変えた方が良さそうな奴を片っ端から変えます。
--- Makefile -CAMLC = ocamlc -g +CAMLC = /opt/local/bin/ocamlc -g -CAMLOPT = ocamlopt -unsafe -ccopt -O4 -ccopt -ffast-math -inline 99999 +CAMLOPT = /opt/local/bin/ocamlopt -unsafe -ccopt -O4 -ccopt -ffast-math -inline 99999 -CAMLDEP = ocamldep +CAMLDEP = /opt/local/bin/ocamldep -CAMLLEX = ocamllex +CAMLLEX = /opt/local/bin/ocamllex -CAMLYACC = ocamlyacc +CAMLYACC = /opt/local/bin/ocamlyacc -WITHCLIBS =-I /usr/lib/ocaml/caml +WITHCLIBS =-I /opt/local/lib/ocaml/caml
これでmakeします。
make # clang: warning: argument unused during compilation: '-fno-defer-pop' # clang: warning: argument unused during compilation: '-no-cpp-precomp' # ld: library not found for -lstr # clang: error: linker command failed with exit code 1 (use -v to see invocation) # File "fastdot_c.c", line 1, characters 0-1: # Error: Error while building custom runtime system # make: *** [megam] Error 2
エラーが起きました。-lstrがないよと怒られています。Makefileの指定がおかしいのかと思ってWITHSTRの項目を直してみましたが、意味なし。
-WITHSTR = str.cma -cclib -lstr +WITHSTR = /opt/local/lib/ocaml/str.cma --cclib -lstr
さんざんググった挙げ句、こんな記事に行き当たりました。最近、stackoverflowの問題解決率高いですねー。
The problem appears to be that this Makefile specifies which C compiler and libraries the OCaml compiler should use as its back-end, using the -cc and -cclib options. On most systems, it will work OK to just specify the standard C compiler as the back-end for OCaml. On Mac OS X, there are 32-bit/64-bit architectural complications. Since you can compile OCaml successfully without this Makefile, I’d suggest that the OCaml compiler already knows how to compile and link OCaml programs. So you might try just removing the -cc and -cclib options from the Makefile.
要するに、ocamlのコンパイラocamlcは-cclibオプションで使うCライブラリを決めるんだけど、macの場合は32bitと64bit両方あるんで下手にオプション指定しないで、ocamlcに自動で読み込ませた方がいいよってことですね。
それでは、この人の言う通り、Makefile内の-cclibオプションを全部消します。
---Makefile -WITHGRAPHICS = graphics.cma -cclib -lgraphics -cclib -L/usr/X11R6/lib -cclib -lX11 +WITHGRAPHICS =graphics.cma -WITHUNIX = unix.cma -cclib -lunix +WITHUNIX =unix.cma -WITHSTR = str.cma -cclib -lstr +WITHSTR =str.cma -WITHBIGARRAY = bigarray.cma -cclib -lbigarray +WITHBIGARRAY =bigarray.cma -WITHNUMS = nums.cma -cclib -lnums +WITHNUMS =nums.cma -WITHTHREADS = threads.cma -cclib -lthreads +WITHTHREADS =threads.cma -WITHDBM = dbm.cma -cclib -lmldbm -cclib -lndbm +WITHDBM =dbm.cma
これでmakeします。
make
通りました。バイナリはどこにあるのかなーと思ったら、ダウンロードしたフォルダにありました。なので、これに対してシンボリックリンクを張ります。
#ユーザー名は自分のに変えてください ln -s /Users/guy/Applications/megam_0.97/megam /Users/guy/bin/megam which megam #/Users/guy/bin/megam
これでmegamはインストールできたっぽいので、NLTKのプログラムに戻り、指示通りPython内で設定を行います。
nltk.config_megam('/Users/guy/bin/megam')
さて、これで動くようになったのですが、トレーニングさせてる間にエラーメッセージを吐き続けるんですよね……
chunker = ConsecutiveNPChunker(train_sents) #optimizing with lambda = 0... #optimizing with lambda = 0... #optimizing with lambda = 0... #これがずっと続く
ソースを追ってみましたが、わかりませんでした。同じエラーが起きている人はいるのですが、解決はしていないっぽいです。というわけで、大変尻切れトンボですみません。
自然言語処理を学んでいる感想
まだ途中なので一概には言えませんが、基本的には機械学習の一分野なので、統計解析を知っていないとどうしようもないなーという感じがします。なので、これが終わったら統計解析の勉強を本格的にやる必要がありますね。
ナイーブベイズとか、交差検定とか、色んなアルゴリスムが出てくるので、これまでのWebサイトを作るためのプログラミングとは違って骨太な感じがします。基本を知れば具体的にやりたいことも固まってくるんじゃないかなーと気長に構えて終わりにします。