Solr-1.4.1でcmecab-javaを使ってみる

久しぶりにjava関連の内容。

前提条件

今回の作業を行った環境は以下のとおり。

OSバージョン    : MacOSX 10.6.4 Snow Leopard
パッケージツール: MacPorts 1.9.1

Java

今回利用するバージョンは 1.6.0_20

javaはOSにインストールされているものをそのまま利用する。但し、一点だけ注意が必要。id:from_kyushu:20090713 に記載のある通り、JDK6を利用すると標準出力の際の文字コードSJISになってしまう。
今回、MeCabで利用する辞書はUTF-8を前提としているほか、MacOSのTerminal.appは文字コードが標準でUTF-8に設定されていることもあり何かと不都合があるので、以下のように設定を行う。

alias javac='javac -encoding UTF-8'
alias java='java -Dfile.encoding=UTF-8'

Solr

http://lucene.apache.org/solr/

何かと話題に登ることも多いオープンソース検索エンジンApache Solrも2010年6月下旬にバージョン1.4.1がリリースされているので、こちらを利用する。ダウンロードミラーサイトからアーカイブファイル(zipまたはtgz)をダウンロードし、適当な作業ディレクトリでアーカイブを展開する。

展開してできたディレクトリの中にexampleというディレクトリがあるので、今回はそれをそのまま使うことにする。exampleディレクトリに移動して、Solrを起動してみよう。

$ cd apache-solr-1.4.1/example
$ java -jar start.jar

ログが止まったところで起動完了なので、ブラウザでadmin画面を確認する。

http://localhost:8983/solr/admin/

MeCab

MeCab http://http://mecab.sourceforge.net/

MeCab(めかぶ)はオープンソースの日本語形態素解析エンジン。同じ日本語形態素解析器としては KAKASI, JUMAN, ChaSen などがあるがそれらと比べて高速に動作するとのこと。


インストールについてはMacPortsを利用する。コマンドは以下のとおり。

$ sudo port install mecab
$ sudo port install mecab-ipadic-utf8

インストールが完了したら、一箇所だけ手書きで修正

$ sudo vi /opt/local/etc/mecabrc
dicdir =  /opt/local/lib/mecab/dic/ipadic
            ↓
dicdir =  /opt/local/lib/mecab/dic/ipadic-utf8

cmecab-java

cmecab-java http://code.google.com/p/cmecab-java/

今回の主役。
インストール方法については↑のサイト(GoogleCode)のwikiに日本語で記載があるので、それを参考にしながらやる。

事前準備

wikiに記載されているネイティブライブラリも含めたすべての構築を行うので、以下のツール類もインストールしておく。

$ sudo port install apache-ant
$ sudo port install scons
$ sudo port install protobuf-java
ダウンロード&展開
$ cd workspace
$ curl -O http://cmecab-java.googlecode.com/files/cmecab-1.7.tar.gz
$ tar zxf cmecab-1.7.tar.gz
Javaライブラリの構築

展開したディレクトリに移動して、antでビルド。

cmecab-1.7/binディレクトリにcmecab-1.7.jarが生成されている。
これをapache-solr-1.4.1/example配下にコピー。

$ mkdir ../apache-solr-1.4.1/example/solr/lib
$ cp ../cmecab-1.7/bin/cmecab-1.7.jar ../apache-solr-1.4.1/example/solr/lib/.


このほかに、今回はLocalProtobufTaggerなども利用する前提なので、cmecab-1.7/lib配下のjarもsolrのプラグインディレクトリにコピーする。

$ cp ../cmecab-1.7/lib/*.jar ../apache-solr-1.4.1/example/solr/lib/.
ネイティブライブラリの構築

展開したディレクトリ配下、jniディレクトリに移動して、まずは設定変更。

SConstruct - 34行目付近から

@@ -34,11 +34,12 @@
 		incpath = [join(javahome, 'include'),
 			   join(javahome, 'include', 'solaris')]
 	else:
-		javahome = '/usr/lib/jvm/java-6-sun'
+		javahome = '/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home'
 		incpath = [join(javahome, 'include'),
-			   join(javahome, 'include', 'linux')]
+			   join(javahome, 'include', 'linux'),
+               r'/opt/local/include']
 
-	libpath = ['/usr/lib', '/usr/local/lib']
+	libpath = ['/opt/local/lib', '/usr/lib', '/usr/local/lib']
 	libs = ['mecab', 'protobuf']
 
 	ccflags = (['-Wall', '-g', '-O2'] +

編集ができたら、さっそくビルド。

すると、jniディレクトリに以下のライブラリが生成されている。

libCMeCab.dylib
libCMeCab_protobuf.dylib

あとはこれを java.library.path で指定されたパス配下にコピー。

$ sudo cp libCMeCab* /Library/Java/Extensions/.


ここまで出来たらあとは http://code.google.com/p/cmecab-java/wiki/HowToUse に書かれている通りにschema.xmlに定義を追加して、solrを起動し直せばOK*1

*1:もしExceptionが出てしまう場合は、ネイティブライブラリの配置場所がjava.library.pathに含まれていないとか、そのあたりが原因のハズなので調べながら適宜修正を。

emacsで英辞郎第五版を使う

仕事柄、また個人で英文翻訳を趣味でやっていることなどもあり、英語のドキュメントに直接当たることが多いこともあって、辞書のお世話になることが多い。当然、翻訳サイトも。

先日、Twitterとatndのつながりで Sphinx+翻訳 Hack-a-thon なるものに参加する機会があって、行ってきたのだけれど、その準備をしているときに「やっぱり辞書とかあった方がいいのかなー」と思って、いろいろと調べていたら、面白い記事を見つけた。

emacsで英辞郎を使う sdicでらくらく検索

軽く半年以上前の記事だったのだけれど、"emacsで英和・和英辞書を使う"というのはむしろ一般的なテーマでもあるので、個人的には興味深く思っていて、ちょっとやってみようか、ということに。

上のサイトを参考にして、書かれている通りにやってみました。
環境としては以下の通り。

参考にしたサイトと違ったところは、辞書をPDIC1行テキスト形式からSDIC形式に変換する時の、nkfのオプション。
WindowsPC(Vista 32bit)上で出力したPDIC1行テキスト形式のファイルのエンコードが UTF-16LE だったので、参照サイトの通りに「nkf -w8」でやると、文字化けてしまってrubyスクリプトの途中でコケてしまったのです。とゆことで、自分が使ったのは以下の通り。

$ cat Waei118.txt | nkf -W16 | ruby pdic2sdic.rb > waeiji118.sdic
$ cat Eijiro118.txt Rya118.txt Reiji118.txt | nkf -W16 | ruby pdic2sdic.rb > eijiro118.sdic

辞書の変換がうまくできれば、あとは特に問題になるところもなくスムースにできました。この事例に関して言うなら、辞書形式の変換がキモなのかもしれません。


他にも、sufaryを使って辞書検索を高速化するといった事例の記事も見つけたのだけれど、それはまた次の機会に。。。

MacOSX10.6 Snow LeopardにSphinxを入れてみる

ちょっとしたきっかけがあって、OSを10.6 Snow Leopard にアップグレード。
ハードウェアを購入して以来、ユーザーのhomeディレクトリ適当に突っ込んできただけだったので、整理の必要を感じていた事もあって「新規インストール」を選択した。

ということで、イチから環境を作ることに。

MacPorts

The MacPorts Project(http://www.macports.org/)を参考にして、Package Installerを使って入れてみる。

http://distfiles.macports.org/MacPorts/MacPorts-1.8.1-10.6-SnowLeopard.dmg

ダウンロード後、マウント->Packageアイコンをダブルクリックでインストール。


インストールできたら、環境変数の追加。
これはbash, zsh向けの記述なのでcsh,tcshの場合は適宜読み替えを。

export PATH=/opt/local/bin:/opt/local/sbin/:$PATH
export MANPATH=/opt/local/man:$MANPATH

さらに次のコマンドを打っておく。

% sudo port -d selfupdate
% sudo port -d sync

Python

Snow Leopardの場合、OSにプレインストールされているpythonのバージョンは2.6.1なのだけれど、ここはMacPortsで入れられる最新版を入れてみる。

% sudo port install python26

自分の場合、ここでなぜか凄まじい数のパッケージを勝手にインストールしまくってくれた。
たった一行入力しただけなんだけどな。。。

Sphinx

いよいよ本丸。とは言っても、コマンドは一つだけ。

% sudo port install py26-sphinx

ところが、ここでトラブル。
テンプレートエンジンであるJinja2のインストールで、コケる。

<中略>
--->  Building py26-jinja2
Error: Target org.macports.build returned: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_python_py26-jinja2/work/Jinja2-2.2.1" && /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6 setup.py --no-user-cfg --with-speedups build " returned error 1
Command output: Traceback (most recent call last):
  File "setup.py", line 86, in <module>
    """
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/core.py", line 152, in setup
    dist.run_commands()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/dist.py", line 987, in run_commands
    self.run_command(cmd)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/dist.py", line 1007, in run_command
    cmd_obj.run()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/command/build.py", line 134, in run
    self.run_command(cmd_name)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/cmd.py", line 333, in run_command
    self.distribution.run_command(command)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/dist.py", line 1007, in run_command
    cmd_obj.run()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/setuptools/command/build_ext.py", line 46, in run
    _build_ext.run(self)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/command/build_ext.py", line 340, in run
    self.build_extensions()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/command/build_ext.py", line 449, in build_extensions
    self.build_extension(ext)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/setuptools/command/build_ext.py", line 175, in build_extension
    _build_ext.build_extension(self,ext)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/command/build_ext.py", line 460, in build_extension
    ext_path = self.get_ext_fullpath(ext.name)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/command/build_ext.py", line 633, in get_ext_fullpath
    filename = self.get_ext_filename(modpath[-1])
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/setuptools/command/build_ext.py", line 85, in get_ext_filename
    ext = self.ext_map[fullname]
KeyError: '_speedups'

Error: The following dependencies failed to build: py26-jinja2 py26-pygments
Error: Status 1 encountered during processing.

いろいろと調べてみていたところ、日本語の情報は皆無。・・・こまった。
ビルドの段階で"_speedups"という文字列を使った処理の際にKeyErrorが発生してしまっているのだろうというところまでは解ったが、如何せん情報がない。

まずは日本語情報を調べてみたが、それらしい情報はヒットしなかった。
ぅーん、と悩んでも仕方がないので、英語の情報も検索範囲に含めて探してみる。。。

まずはJinja2の公式ドキュメンテーション

http://jinja.pocoo.org/2/documentation/

Installationのセクションを読むと、「speedupsはデフォルトではOFFになっているから、使うんだったら--with-speedupsを使って」という注意書きがある。
先ほどのログを見ると、そのオプションが指定されている模様。まぁ、公式ドキュメントの指示に正しく従っているのだからそれはいいとしよう。


で、発見したのがこの記事。

http://bitbucket.org/tarek/distribute/issue/41/keyerror-_speedups

結局、macportsのパッケージ自体に問題があったのではなくて、setuptoolsのbuild_ext.pyに問題があったみたい。
上記のエントリでは「0.6.2でFixされる」って書いてある。

が、現時点でmacportsを使ってインストールできるバージョンは「@0.6c9_0」となっている。
つまりは、macportsで入れる場合、上述の対応は自前でやれ、と。

ということで、以下の通り。
修正の内容は上記エントリを参照のこと。

% cd /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/setuptools/command
% sudo cp -p build_ext.py build_ext.py_org
% vi build_ext.py

で、修正後に改めてportsを実行する。

% sudo port install py26-sphinx

これでOK。

MacOS LeopardにPython&Djangoを入れてみる

タイトルの通り、久しぶりの技術系記事っす。

前提条件

作業対象のマシンからインターネット接続が可能であること。
構築にはMacPortsを使用する。
*1
Djangoについては、以下の通りとする。
Django: 1.0.2_1(by MacPorts)

Python

pythonMacOSに標準で入っているpython2.5でも大丈夫。だが、インストール/アンインストールの手間を考えてMacPortsで揃える。

% sudo port install python26
% sudo port install python_select
% python_select python26
% /opt/local/bin/python -V
Python 2.6.1

Django

Djangoもインストール。

% sudo port install py26-django

このままだとPATHが通っていないので、通し直す。

% ls -la /usr/local/bin/python
../../../Library/Frameworks/Python.framework/Versions/2.5/bin/python2.6
% sudo rm /usr/local/bin/python
% sudo ln -s /opt/local/bin/python2.6 /usr/local/bin/python

ここでインストールが成功しているか、テスト。

% django-admin.py
Type 'django-admin-2.6.py help' for usage.

と、ここまででprojectを作成する手前まで。

*1:インストール/アップデート方法など、詳細についてはThe MacPorts Project(http://www.macports.org/)を参照のこと

久々の買い物

前回、書籍購入のログを書いた後から酷く忙しくなってしまって、放置してしまった。
コンスタントに記事を書くようにしたい。

書店で目に付いたものからピックアップ。
前者はブログの書評などから、後者は書店でたまたま目について。

他にはiPhone用にクリアジャケット、それからソーラー充電器(一般的なケータイだけじゃなくてiPhoneもOKな奴)を入手。
8月には本当に久しぶりの長期キャンプ(とはいってもたかだか4泊5日)があって充電はまともに出来ないだろうから、と
たまの休みを利用して足で探してみた。

SIGG Bottle

[rakuten:hotman:10001022:detail]

ついでにこんなのも見つけた。
以前から興味は持っていたものの、手を出すか否かで悩んでいたところだった。
軽くて丈夫、ここのところデザイン性の高い品も出ていることを知って「買いたい熱」が再燃。
とゆことで、売り場で散々悩んだ挙句にこちらをGET。
冷たいドリンクを入れるとスノーフレークが浮き出るという、「涼」を呼ぶ一品。


まぁ、そんな感じで。

読書&書籍購入ログ

このところのふた月くらいは、技術系から少し離れてみた。

こんな感じ。

[rakuten:book:13108057:detail]
[rakuten:book:13108058:detail]


通勤途上の手持ち無沙汰をいくらか改善する程度ではあったけれど、そもそも本はそういう目的で読むようにしているものだから、まぁ当初の目的は少なくとも達成されているように思う。
書評を書くほどきちんと読み込んだ訳でもないし、読了後いくらかの時間も経ってしまったので、正直なところあれこれと書くつもりは微塵も無い。あしからず。