fbpx

メニュー

Mac OS XにMegaMをインストールする

高橋文樹 高橋文樹

この投稿は 12年半 前に公開されました。いまではもう無効になった内容を含んでいるかもしれないことをご了承ください。

現在、文学機械を作るという使命感の元、自然言語処理を勉強するべく『入門 自然言語処理』を紐といています。

[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.

gcc ld: symbol(s) not found for architecture x86_64

要するに、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サイトを作るためのプログラミングとは違って骨太な感じがします。基本を知れば具体的にやりたいことも固まってくるんじゃないかなーと気長に構えて終わりにします。

すべての投稿を見る

高橋文樹ニュースレター

高橋文樹が最近の活動報告、サイトでパブリックにできない情報などをお伝えするメーリングリストです。 滅多に送りませんので、ぜひご登録お願いいたします。 お得なダウンロードコンテンツなども計画中です。