CentOS Sen

Javaで形態素解析といえば、Sen だったのですが、最近はそうでもないようです。Igo とかを使う方が手軽という意見もあるようです。

とりあえず、Sen が使えるようにしてみました。

1. Apache Ant のダウンロードとインストール(Apache Ant)。ここでは、ホームディレクトリの srcにapache-ant-1.8.2-bin.tar.gzをおき、ホームディレクトリのapplications/apache-ant-1.8.2 に展開しました。

cd ~/applications; tar xzf ../src/
tar xzf apache-ant-1.8.2-bin.tar.gz

2. Senダウンロード(Sen – Java.net)と辞書構築。スクリプトを用意してみた。ホームディレクトリに applications, src ディレクトリがあることを前提としています。ipadic-2.6.0を使う場合です。

#!/bin/sh
cd  ${HOME}/applications
unzip ${HOME}/src/sen-1.2.2.1.zip

SEN_HOME=${HOME}/applications/sen-1.2.2.1
for f in sen.xml sen-processor.xml
do
    cat ${SEN_HOME}/conf/${f} | sed 's/euc-jp/utf-8/' >  ${SEN_HOME}/conf/${f}.new
    mv  ${SEN_HOME}/conf/${f}   ${SEN_HOME}/conf/${f}.bak
    mv  ${SEN_HOME}/conf/${f}.new   ${SEN_HOME}/conf/${f}
done

SEN_HOME=${HOME}/applications/sen-1.2.2.1
f=${SEN_HOME}/dic/dictionary.properties
cat $f | sed 's/EUC-JP/utf-8/' > $f.new
mv $f $f.bak
mv $f.new $f

ANT_HOME=${HOME}/applications/apache-ant-1.8.2
cd ${SEN_HOME}
${ANT_HOME}/bin/ant

cd ${SEN_HOME}/dic
${ANT_HOME}/bin/ant

cd ${HOME}/applications
mv "sen-1.2.2.1" "sen-1.2.2.1_ipadic-2.6.0"

3. 動作確認 … 「すもももももももものうち」 が有名なのですかね。

SEN_HOME=${HOME}/applications/sen-1.2.2.1-ipadic-2.6.0  \
  sh  ${HOME}/applications/sen-1.2.2.1-ipadic-2.6.0/bin/sen.sh
done.
Please input Japanese sentence:
すもももももももものうち
すもも (すもも) 名詞-一般(0,3,3) スモモ スモモ
も (も) 助詞-係助詞(3,4,1) モ モ
もも (もも) 名詞-一般(4,6,2) モモ モモ
も (も) 助詞-係助詞(6,7,1) モ モ
もも (もも) 名詞-一般(7,9,2) モモ モモ
の (の) 助詞-連体化(9,10,1) ノ ノ
うち (うち) 名詞-非自立-副詞可能(10,12,2) ウチ ウチ

■補足1
アルファベットが分解されないようにするには、sen.xml へ composit を追加すると良いようです。次のような説明を見つけました。

[連結品詞]・設定ファイル sen.xml に <composit>連結後の品詞 連結対象の品詞1 連結対象の品詞2 …</composit> または <composit>品詞</composit> と指定する。後者の場合は指定された品詞の並びをひとまとめにして、その品詞を与える。

例)sen.xml で下記をconfiguration要素の中に記載すれば良いようです。

   <!-- 構成語 or 複合語 -->
   <compound>構成語</compound>

   <!-- 連結後の品詞 連結対象の品詞…
        品詞1個だけを指定した場合は、その品詞の並びを連結する。
   -->
   <composit>名詞-数 名詞-数 名詞-数記号</composit>
   <composit>記号-アルファベット</composit>

   <!-- 注釈開始文字列 注釈終了文字列 品詞
        終了文字列を省略すると、開始文字列に一致する文字列そのものが
        注釈とみなされる
   -->
   <remark>&lt; &gt; 記号-注釈</remark>
   <remark>《《 》》 記号-注釈</remark>
   <remark>《- -》 記号-注釈</remark>

■補足2
ipadic-2.7.0 を使いたいときは、ipadic-2.7.0 の *.cha を削除して、ipadic-2.6.0 の *.cha で置き換える方法があるようです。

#!/bin/sh
cd  ${HOME}/applications
unzip ${HOME}/src/sen-1.2.2.1.zip

SEN_HOME=${HOME}/applications/sen-1.2.2.1
for f in sen.xml sen-processor.xml
do
    cat ${SEN_HOME}/conf/${f} | sed 's/euc-jp/utf-8/' >  ${SEN_HOME}/conf/${f}.new
    mv  ${SEN_HOME}/conf/${f}   ${SEN_HOME}/conf/${f}.bak
    mv  ${SEN_HOME}/conf/${f}.new   ${SEN_HOME}/conf/${f}
done

SEN_HOME=${HOME}/applications/sen-1.2.2.1
f=${SEN_HOME}/dic/dictionary.properties
cat $f | sed 's/EUC-JP/utf-8/' > $f.new
mv $f $f.bak
mv $f.new $f

ANT_HOME=${HOME}/applications/apache-ant-1.8.2
cd ${SEN_HOME}
${ANT_HOME}/bin/ant

SEN_HOME=${HOME}/applications/sen-1.2.2.1
cd ${SEN_HOME}/dic
${ANT_HOME}/bin/ant download
${ANT_HOME}/bin/ant melt
f=${SEN_HOME}/dic/build.xml
cat ${f} | sed 's/2.6.0/2.7.0/g' > ${f}.new
mv ${f}  ${f}.bak
mv ${f}.new  ${f}
${ANT_HOME}/bin/ant download
${ANT_HOME}/bin/ant melt
rm ipadic-2.7.0/*.cha
cp ipadic-2.6.0/*.cha ipadic-2.7.0/
${ANT_HOME}/bin/ant 

cd ${HOME}/applications
mv "sen-1.2.2.1" "sen-1.2.2.1_ipadic-2.7.0"

■補足3 長すぎる単語への対応に問題があるそうです。置換が必要だとのこと。参考(Lucene/JapaneseAnalyser/Sen、辞書にすごく長い単語が含まれてるとその単語を含んだドキュメントを追加する際にIndexOutOfBoundsExceptionで失敗する – <s>gnarl,</s>技術メモ”’<marquee><textarea>¥

cat src/java/net/java/sen/Dictionary.java | sed 's/cnt++/c{cnt++;if(b.length <= cnt) {byte new_b[]=new byte[b.length*2];fr(int i=0;i<b.length;i++){new_b[i]=b[i];}b=new_b;}}/'

■参考リンク

同じカテゴリの記事: Java