Jan 31, 2011

Apache Solr 1.4 インストール on Tomcat

lucene-ja か、cmecab-java のどちらがいいか悩ましい。

検索エンジンの最新版を追わないのであれば、
JNI バインディングじゃない lucene-ja の方が好み。
でも、最新版を追いたくて、自分でメンテナンスする手間を省きたければ、
cmecab-java ってところか。

パフォーマンスは、両方の環境を作って比較するしかないかな。



環境:
CentOS 5.5 i386 on VMware Fusion3
Java6 SDK
Apache Ant
Apache Tomcat 5.5

インストールするもの:
Apache Solr 1.4
lucene-ja 2.0 + sen 1.2.2.1
cmecab-java + mecab 0.98


Apache Solr 1.4.1
download from http://www.apache.org/dyn/closer.cgi/lucene/solr/

# tar xzf apache-solr-1.4.1.tgz -C $INSTALL_DIR
# cd $INSTALL_DIR
# chown -R tomcat.tomcat apache-solr-1.4.1
# ln -s apache-solr-1.4.1 apache-solr
# export SOLR_HOME=$INSTALL_DIR/apache-solr


sen-1.2.2.1
インストール手順は /2011/01/sen-1221.html

Tomcat の起動オプションに sen.home を追加する。

# vi /etc/tomcat5/tomcat5.conf

JAVA_OPTS="$JAVA_OPTS -Dcatalina.ext.dirs=$CATALINA_HOME/shared/lib:$CATALINA_HOME/common/lib -Dsen.home=/usr/local/sen-1.2.2.1"


lucene-ja-2.0
インストール手順は /2011/01/lucene-ja-20.html




次にwebappsの設定

Tomcat に Solr の webapps を配置

# mkdir /var/lib/tomcat5/webapps/solr
# cd /var/lib/tomcat5/webapps/solr
# jar xf $SOLR_HOME/example/webapps/solr.war


sen.jar を webappsにコピーする。

# cp $SEN_HOME/lib/sen.jar /var/lib/tomcat5/webapps/solr/WEB-INF/lib


lucene-core.jar と lucene-ja.jar を webappsにコピーする。

# cd ~/lucene-ja/lib/
# cp lucene-core-2.0.0.jar lucene-ja-custom.jar /var/lib/tomcat5/webapps/solr/WEB-INF/lib/


solrのホームディレクトリを作成

サンプルをベースに利用します。

# cd $SOLR_HOME
# cp -a example/solr home

solrconfig.xml を編集して、データディレクトリを設定します。

# cd $SOLR_HOME
# vi home/conf/solrconfig.xml

  <dataDir>/usr/local/apache-solr/home/data</dataDir>


webapps の web.xml で、solr/home を設定します。

# vi /var/lib/tomcat5/webapps/solr/WEB-INF/web.xml

    <env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>/usr/local/apache-solr/home</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>



Tomcat 起動

# /etc/init.d/tomcat5 start
# cat /var/log/tomcat5/catalina.out

ブラウザで、起動を確認する。

http://solrhost:8080/solr/


※ Tomcat の起動時に Xpath のエラーが出る場合は、xalan, xerces をインストールする。

download from http://xml.apache.org/xalan-j/downloads.html

# tar xzf xalan-j_2_7_1-bin-2jars.tar.gz
# cp xalan-j_2_7_1/*.jar /var/lib/tomcat5/shared/lib


※ 日本語の検索で文字化けする場合は、SetCharacterEncodingFilter を使う

ここではTomcat5のサンプルをそのまま利用します。

# cp SetCharacterEncodingFilter.class /var/lib/tomcat5/shared/classes/filters/
# vi /var/lib/tomcat5/webapps/solr/WEB-INF/web.xml

  <filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


# vi /etc/tomcat5/tomcat5.conf

    <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true"
               URIEncoding="UTF-8" useBodyEncodingForURI="true" />




参考サイト

http://lucene.apache.org/solr/tutorial.html
http://d.hatena.ne.jp/knaka20blue/20080922/1222104683
http://kazuakey.blogspot.com/2010/12/solr-14-sen.html
http://d.hatena.ne.jp/gnarl/20080912/1221189985

詳解 Objective-C 2.0 改訂版

Objective-C 面白い。

Mac App Store で提供できるアプリなんかできたらいいなと思って、お勉強中。

オブジェクトのメソッドを使う際に、メッセージを送信するっていうのに個人的にハマった。

ポリモーフィズム が id の型で柔軟に使えるのもいいし、まだまだ始めたばかりだけど、
言語の魅力にハマりそうな予感。


lucene-ja 2.0 インストール

Lucene を、Solr1.4 で利用する場合には、一部ソースの修正が必要です。


環境:
CentOS 5.5 i386 on VMware Fusion3
Java6 SDK


download from https://sen.dev.java.net/servlets/ProjectDocumentList?folderID=755&expandFolder=755&folderID=755


修正するソースは、org.apache.lucene.analysis.ja パッケージの以下4ファイルです。

DigitFilter.java
KatakanaStemFilter.java
MonitorFilter.java
POSFilter.java


コンストラクタ中の input = in; をコメントアウトします。

# unzip lucene-ja-2.0test2.zip
# cd lucene-ja/src/org/apache/lucene/analysis/ja/
# vi DigitFilter.java KatakanaStemFilter.java MonitorFilter.java POSFilter.java

// input = in;


build.xml を配置してコンパイル

# cd ~/lucene-ja
# ant
# ls -l lib/lucene-ja-custom.jar



参考サイト

http://ameblo.jp/miralis/entry-10290203004.html
http://kazuakey.blogspot.com/2010/12/solr-14-sen.html
http://d.hatena.ne.jp/gnarl/20080912/1221189985

mecab 0.9.8 インストール

環境:
CentOS 5.5 i386 on VMware Fusion3


C++ のコンパイラがない場合はインストールする。

# yum install gcc gcc-c++


Mecabのインストール
download from http://mecab.sourceforge.net/

$ tar xzf mecab-0.98.tar.gz
$ cd mecab-0.9.8
$ ./configure
$ make
$ su
# make install


確認

# mecab
すもももももももものうち
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS


参考サイト

http://mecab.sourceforge.net/

sen 1.2.2.1 インストール 辞書をnaist-jdic にする

Mecab の Java移植版。
構築する辞書の文字コードを、サーバの文字コードと同じUTF-8に変更します。
また、ipadic の後継版である、NAIST Japanese Dictional を使うように修正します。

download from https://sen.dev.java.net/servlets/ProjectDocumentList?folderID=755&expandFolder=755&folderID=755


環境:
CentOS 5.5 i386 on VMware Fusion3
Apache Ant


sen 1.2.2.1 インストール

# unzip sen-1.2.2.1.zip -d $INSTALL_DIR
# export SEN_HOME=$INSTALL_DIR/sen-1.2.2.1


バグFIX

http://d.hatena.ne.jp/gnarl/20080912/1221189985

※ sen のコンパイルには、gcc-c++ などが必要です。


sen の辞書作成

a. 構築する辞書の文字コードを、utf-8 に変更する。(デフォルトは euc-jp)
b. NAIST-jdic の辞書を利用するように変更する。

文字コードの編集対象ファイルは、sen.xml, sen-processor.xml, dictionary.properties の3つです。
元々の辞書ファイルは、euc-jp で記述されており、その設定は変更しません。

# cd $SEN_HOME
# vi conf/sen.xml
   <charset>utf-8</charset>

# vi conf/sen-processor.xml
   <charset>utf-8</charset>

# vi dic/dictionary.properties
   sen.charset=utf-8


ChaSen 用の NAIST辞書ファイル(NAIST-jdic)をダウンロード。
http://sourceforge.jp/projects/naist-jdic/

# cp naist-jdic-0.4.3.tar.gz $SEN_HOME/dic/


build.xml の編集
ipadic の設定を、naist-jdic に変更します。
また同時に、OutOfMemoryError を回避するために、maxmemory を増やしておきます。

# cd $SEN_HOME/dic
# vi build.xml

  <target name="create" depends="dics0" unless="dics.present">
    <java classname="net.java.sen.tools.MkSenDic"
          fork="true"
          maxmemory="512m">


ipadic のファイル名を、naist-jdic に変更。

# diff build.xml build_naist-jdic.xml
17,19c17,19
<   <property name="ipadic.version" value="2.6.0"/>
<   <property name="ipadic.archive"  value="ipadic-${ipadic.version}.tar.gz"/>
<   <property name="ipadic.dir"  value="ipadic-${ipadic.version}"/>
---
>   <property name="ipadic.version" value="0.4.3"/>
>   <property name="ipadic.archive"  value="naist-jdic-${ipadic.version}.tar.gz"/>
>   <property name="ipadic.dir"  value="naist-jdic-${ipadic.version}"/>
56c56
<         <available file="ipadic-${ipadic.version}/Noun.dic"/>
---
>         <available file="naist-jdic-${ipadic.version}/Noun.dic"/>
89c89
<       <arg line="${ipa2mecab} ipadic-${ipadic.version}"/>
---
>       <arg line="${ipa2mecab} naist-jdic-${ipadic.version}"/>


辞書ファイルの生成

# ant

確認

# sh $SEN_HOME/bin/sen.sh
done.
Please input Japanese sentence:
[INFO] Dictionary - token file = /usr/local/sen-1.2.2.1/dic/token.sen
[INFO] Dictionary - time to load posInfo file = 22[ms]
[INFO] Dictionary - double array trie dictionary = /usr/local/sen-1.2.2.1/dic/da.sen
[INFO] DoubleArrayTrie - loading double array trie dict = /usr/local/sen-1.2.2.1/dic/da.sen
[INFO] DoubleArrayTrie - loaded time = 0.631[ms]
[INFO] Dictionary - pos info file = /usr/local/sen-1.2.2.1/dic/posInfo.sen
[INFO] Dictionary - time to load pos info file = 0[ms]
[INFO] Tokenizer - connection file = /usr/local/sen-1.2.2.1/dic/matrix.sen
[INFO] Tokenizer - time to load connect cost file = 91[ms]

無事に形態素解析されますか?
無事 (無事) 名詞-形容動詞語幹(0,2,2) ブジ ブジ
に (に) 助詞-副詞化(2,3,1) ニ ニ
形態素 (形態素) 名詞-一般(3,6,3) ケイタイソ ケイタイソ
解析 (解析) 名詞-サ変接続(6,8,2) カイセキ カイセキ
さ (する) 動詞-自立(8,9,1) サ サ
れ (れる) 動詞-接尾(9,10,1) レ レ
ます (ます) 助動詞(10,12,2) マス マス
か (か) 助詞-副助詞/並立助詞/終助詞(12,13,1) カ カ
? (?) 記号-一般(13,14,1) ? ?

すもももももももものうち
すもも (すもも) 名詞-一般(0,3,3) スモモ スモモ
も (も) 助詞-係助詞(3,4,1) モ モ
もも (もも) 名詞-一般(4,6,2) モモ モモ
も (も) 助詞-係助詞(6,7,1) モ モ
もも (もも) 名詞-一般(7,9,2) モモ モモ
の (の) 助詞-連体化(9,10,1) ノ ノ
うち (うち) 名詞-非自立-副詞可能(10,12,2) ウチ ウチ

在庫品SALE
在庫 (在庫) 名詞-サ変接続(0,2,2) ザイコ ザイコ
品 (品) 名詞-接尾-一般(2,3,1) ヒン ヒン
S (S) 記号-アルファベット(3,4,1) エス エス
A (A) 記号-アルファベット(4,5,1) エイ エイ
L (L) 記号-アルファベット(5,6,1) エル エル
E (E) 記号-アルファベット(6,7,1) イー イー

NAIST-jdic への移行は無事できましたが、ただ、英単語を分つことができない。。
原因はアルファベットが辞書に登録してあるためでした。

そこで、アルファベットを取り除いてみると。

# diff ipa2mecab_org.pl ipa2mecab.pl
188,189d187
<     next if ($pos2 eq 'アルファベット');
<

# ant
# sh $SEN_HOME/bin/sen.sh

在庫品SALE
在庫 (在庫) 名詞-サ変接続(0,2,2) ザイコ ザイコ
品 (品) 名詞-接尾-一般(2,3,1) ヒン ヒン
SALE (SALE) 未知語(3,7,4) null null

未知語でも良いので、連結してくれる方がいいよね。


さて、あとは、mecab用の最新の辞書を取込んでみたいところ。
mecab-naist-jdic-0.6.3-20100801/naist-jdic.csv
の方が約30,000語も多いし。。

どなたか NAIST-jdic for mecab の辞書を sen に取込む方法をご存知の方がいれば、
ご連絡くださいますと幸いです。


追記:

2/18
その後、sen.xml に、composit の設定を追加することによって、アルファベットや数字を結合できることが
分かりました。
そのため、辞書からアルファベットを取り除くよりも、composit を設定して結合する方がいいかと思い、
再度アルファベットを辞書に登録しました。
また、「-」をアルファベットとすると、wi-fi のような単語を作ることができるので、
- を記号、アルファベットとして、カスタム辞書に登録しました。
Sen は奥深いですね。関係者の方々に心から感謝です。


参考サイト

http://ultimania.org/sen/
http://kazuakey.blogspot.com/2010/12/solr-14-sen.html
http://d.hatena.ne.jp/gnarl/20080912/1221189985
http://d.hatena.ne.jp/code46/comment?date=20090531