入門自然言語処理を読み進めるためのPython&NLTKインストール


興味があったオライリーの入門自然言語処理を購入。pythonの勉強にもなるだろう。
ぱらっと読みだけではなく、せっかくなので手を動かしてお勉強ということで本書で必要なプログラミング言語pythonと言語処理用ライブラリのNLTKを使えるようにする。

pythonのインストール

サーバーはCentOS5.5 32bit使用
pythonは標準で入っている2.4でもいけるようだが、2.5以上にはしたいので、2.6の最新をいれる.既存環境を汚さないようにmake altinstall&virtualenv.

yum install python-setuptools
easy_install virtualenv
wget http://www.python.org/ftp/python/2.6.6/Python-2.6.6.tgz
tar xvzf Python-2.6.6.tgz
cd Python-2.6.6
less README
./configure
make
make altinstall
su - shin
$ python -V
Python 2.4.3

このままだと2.4がデフォルトpythonのままなので、virtualenvさんの出番

$ mkdir python26
$ virtualenv --python=/usr/local/bin/python2.6 ~/python26
$ source python26/bin/activate
(python26)[shin@lua ~]$
$ python -V
Python 2.6.6

NLTKのインストール

本の中や公式サイト自体にインストール必要なものはあるのでいれていく。

$ pip install PyYAML
$ pip install nltk
Downloading/unpacking nltk
  Downloading nltk-2.0b9.tar.gz (941Kb): 941Kb downloaded
  Running setup.py egg_info for package nltk
    Traceback (most recent call last):
      File "<string>", line 14, in <module>
    IOError: [Errno 2] No such file or directory: '/home/shin/python26/build/nltk/setup.py'
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):

  File "<string>", line 14, in <module>

IOError: [Errno 2] No such file or directory: '/home/shin/python26/build/nltk/setup.py'

----------------------------------------
Command python setup.py egg_info failed with error code 1
Storing complete log in /home/shin/.pip/pip.log

あぁなぜなのと思ったらズバリ解答が見つかった。build/nltk下にあることをpipは期待しているが、実際はnltkのさらに下にバージョン番号付きでディレクトリが掘られているので、中のファイルを一階層上げろや!ということ。ぐぐらんでも解決出来たなこれ。
http://code.google.com/p/nltk/issues/detail?id=534

$ cd ~/python26/build/nltk/
$ ls
$ cd nltk-2.0b9
$ mv ./* ../
$ pip install nltk
$ pip freeze
PyYAML==3.09
nltk==2.0b9
wsgiref==0.1.2

本書1.1.2 NLTKを使ってみよう

はい使ってみます。

$ python
>>> import nltk
>>> nltk.download()
NLTK Downloader
---------------------------------------------------------------------------
    d) Download      l) List      c) Config      h) Help      q) Quit
---------------------------------------------------------------------------
Downloader> l

ずらっと色々でる、せっかくなので眺める。しかしなんて至れり尽くせりインターフェースなんだ。さすが教育用途を考えているだけのことはあって、とっつきやすい。

Downloader> d book
    Downloading collection 'book'
       |
       | Downloading package 'brown' to /home/shin/nltk_data...
       |   Unzipping corpora/brown.zip.
...省略
     Done downloading collection 'book'
Downloader> q
True
>>>

あとは本の通りちょこちょこやり。

プロット画像生成のためのMatplotlib

数学用ライブラリNumPyとMatplotlibが必要ということで入れる

pip install numpy
pip install matplotlib
>
>gcc: error trying to exec 'cc1plus': execvp: No such file or directory
>
>error: command 'gcc' failed with exit status 1
>

はいエラー。gccはあるけれど何がイカンのか。cc1plusてなんだろうか。gccとかを使うことがないので名前を見ても必要なものがさっぱりだな。こういう時のgoogle先生
http://www.linuxquestions.org/questions/linux-newbie-8/gcc-error-trying-to-exec-cc1plus-execvp-no-such-file-or-directory-fedora-10-a-716507/
c++用のライブラリがなかったようだ。gcc-c++なんて単語を初めて見た

$ sudo yum install gcc-c++
$ pip install matplotlib

はい、エラーエラー。公式のドキュメントには目を通しましょう。
http://matplotlib.sourceforge.net/users/installing.html

$sudo yum install freetype freetype-devel libpng libpng-devel
$ pip install matplotlib

ようやく成功したけれども、肝心のコマンドがエラー

>>> text4.dispersion_plot(["citizens", "democracy", "freedom", "duties", "America"])
/home/shin/python26/lib/python2.6/site-packages/nltk/draw/__init__.py:16: UserWarning: nltk.draw package not loaded (please install Tkinter library).
  warnings.warn("nltk.draw package not loaded "
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/shin/python26/lib/python2.6/site-packages/nltk/text.py", line 451, in dispersion_plot
    from nltk.draw import dispersion_plot
ImportError: cannot import name dispersion_plot

Tkinterてなんだろということで調べて入れることに。
http://wiki.python.org/moin/TkInter

# yum install tk tk-devel tcl tcl-devel
# cd /usr/local/src/Python-2.6.6
# make
# make altintall

tkinterが使用できることの確認

>>> import _tkinter
>>> import Tkinter
>>> text4.dispersion_plot(["citizens", "democracy", "freedom", "duties", "America"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/shin/python26/lib/python2.6/site-packages/nltk/text.py", line 452, in dispersion_plot
    dispersion_plot(self, words)
  File "/home/shin/python26/lib/python2.6/site-packages/nltk/draw/dispersion.py", line 25, in dispersion_plot
    raise ValueError('The plot function requires the matplotlib package.'
ValueError: The plot function requires the matplotlib package.See http://matplotlib.sourceforge.net/

まだなにかあるんかい orz。matplotlibはインストール済みなのにmatplotlibがない?なぜ?ということでエラーはいてるソースを確認

$ vim -R "/home/shin/python26/lib/python2.6/site-packages/nltk/draw/dispersion.py"
 22     try:
 23         import pylab
 24     except ImportError:
 25         raise ValueError('The plot function requires the matplotlib package.'
 26                      'See http://matplotlib.sourceforge.net/')

なん…だと。matplotlibじゃなくてpylabのimport時の例外をキャッチしてる。試す

>>> import pylab
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/shin/python26/lib/python2.6/site-packages/pylab.py", line 1, in <module>
    from matplotlib.pylab import *
  File "/home/shin/python26/lib/python2.6/site-packages/matplotlib/pylab.py", line 206, in <module>
    from matplotlib.numerix import npyma as ma
  File "/home/shin/python26/lib/python2.6/site-packages/matplotlib/numerix/npyma/__init__.py", line 7, in <module>
    from numpy.core.ma import *
ImportError: No module named ma

そんなこと言われましても困りますぜ…うーんと、ぐぐったら正に同じ問題を見つけた。この対応はツライ.こういう場合の正しいimport処理はどうすべきなのだろうか。
http://www.saiweb.co.uk/mac/matplotlib-importerror-no-module-named-ma

$vi /home/shin/python26/lib/python2.6/site-packages/matplotlib/numerix/ma/__init__.py
> 15     else:
> 16         #from numpy.core.ma import *
> 17         from numpy.ma import *
> 18         #print "using ma"
$vi /home/shin/python26/lib/python2.6/site-packages/matplotlib/numerix/npyma/__init__.py
>  6 else:
>  7     #from numpy.core.ma import *
>  8     from numpy.ma import *
>  9     #print "using ma"

このエラーを引き起こしたのはnumpyのバージョンが新し過ぎたことなのだろう。

>>> print numpy.__version__
1.5.1

http://matplotlib.sourceforge.net/users/installing.html

numpy 1.1 (or later)

公式サイトだとnumpy 1.1以上が必要ってなっているけれども、途中でpathが変わったようだ。まさかcoreなんて名前が付いているもののpathが変わるとは思ってなかったんだろう。なぜ構造を変えたんだnumpy。ちなみにnumpy.coreがなくなったのかと思ったけどまだあった。

>>> text4.dispersion_plot(["citizens", "democracy", "freedom", "duties", "America"])
>>>

よし出来た。しかしCUIなので何も表示されず。画像ファイルがカレントディレクトリに出来ているかなと思ったけれど、何も出来ておらず。dispersion.pyを見てみるがもちろんファイル出力処理なんてものはなく…
どう見ても徒労です。本当に(ry
画像出力する方法はあるんだろうけれども後回し。基本環境は整ったと思いたい。