形態素解析システム Sen

インストール

Apache Antのインストール

Sen は辞書を構築するのに Apache Ant というビルドツールを使う。 これをあらかじめインストールしておく必要がある。

Senのインストール

展開

/usr/local に展開し、ディレクトリ名を sen-1.2.2.1 から sen に変更する。

$ su
# cd /usr/local
# unzip ~学籍番号/Desktop/sen-1.2.2.1.zip
# mv sen-1.2.2.1 sen

環境変数の設定

Sen では、Sen のインストールされているディレクトリ SEN_HOME を設定するほか、 Java の CLASSPATH に sen.jar と commons-logging.jar (jakarta project のロギングライブラリ) を追加する必要がある。なお、commons-logging.jar は Sen に同梱されている。

ログイン時に自動的に設定されるよう、ディレクトリ /etc/profile.d の下に、 ファイル /etc/profile.d/sen.sh を作成する。 内容は以下の通り。

#!/bin/bash

export SEN_HOME=/usr/local/sen

if [ -z "$CLASSPATH" ]; then
  CLASSPATH=.
elif [ x`echo $CLASSPATH | grep "^:"` != "x" ]; then
  CLASSPATH=.$CLASSPATH
elif [ "$CLASSPATH" != "." -a x`echo $CLASSPATH | grep "^\\.:"` = "x" ]; then
  CLASSPATH=.:$CLASSPATH
fi

for jar in sen commons-logging; do
  if [  x`echo $CLASSPATH | grep "/$jar.jar"` = "x" ]; then
    if [ -e $SEN_HOME/lib/$jar.jar ]; then
      export CLASSPATH=$CLASSPATH:$SEN_HOME/lib/$jar.jar
    fi
  fi
done

~学籍番号/Desktop/ にダウンロードした場合は、以下のようにする。

$ su
# cd /etc/profile.d
# mv ~学籍番号/Desktop/sen.sh .
# chown root.root sen.sh
# chmod +rx sen.sh
# exit

bash をログインシェルとして起動し直すと変更が反映される。 echo で確認できる。

$ exec bash -l
$ echo $CLASSPATH

辞書の構築

ant を使い、解析のための辞書を構築する。 辞書のパッケージを自動的に取得するため、ネットワークの接続が必要である。

$ su
# cd /usr/local/sen
# ant
Buildfile: build.xml
...
BUILD SUCCESSFUL
Total time: X seconds
# cd dic
# ant
Buildfile: build.xml
...
BUILD SUCCESSFUL
Total time: Y minute Z seconds
# 

proxy経由でしか外につなげない場合は、 ant -Dproxy.host=XXX -Dproxy.port=8080 などとする。

bash をログインシェルとして起動後、実行の確認を以下のようにする。 Ctrl-d で終了。

$ bash -l
$ sh /usr/local/sen/bin/sen.sh
なにか日本語を入力して試そう
なにか  (なにか)        副詞-助詞類接続(0,3,3)  ナニカ  ナニカ
日本語  (日本語)        名詞-一般(3,6,3)        ニホンゴ        ニホンゴ
を      (を)    助詞-格助詞-一般(6,7,1) ヲ      ヲ
入力    (入力)  名詞-サ変接続(7,9,2)    ニュウリョク    ニューリョク
し      (する)  動詞-自立(9,10,1)       シ      シ
て      (て)    助詞-接続助詞(10,11,1)  テ      テ
試そう  (試そう)        名詞-サ変接続(11,14,3)  シソウ  シソー
$ 

プログラムからの Sen の利用

Sen には、 String を解析するクラス net.java.sen.StringTagger と、 Stream を解析するクラス net.java.sen.StreamTagger がある。 1つの形態素(単語)はクラス net.java.sen.Token のインスタンスとなる。

クラスStringTagger のメソッド

static StringTagger getInstance(java.util.Locale locale)
Locale (言語) を指定して、インスタンスを生成する (コンストラクタは使用しない)。 Locale には通常 java.util.Locale.JAPANESE を指定する。
Token[] analyze(String input)
文字列 input を形態素解析し、形態素を表すクラス Token のインスタンスの配列を返す。
boolean hasNext()
次の形態素があれば真を返す。
Token next()
次の形態素(クラス Token のインスタンス)を返す。

クラスStreamTagger のコンストラクタ

StreamTagger(java.io.Reader reader, java.util.Locale locale)
Stream を読む reader と Locale を指定してインスタンスを生成する。

クラスStreamTagger のメソッド

boolean hasNext()
次の形態素があれば真を返す。
Token next()
次の形態素(クラス Token のインスタンス)を返す。

クラスToken のメソッド

String toString()
形態素(表層表現)
String getBasicString()
基本形
String getPos()
品詞情報(品詞、用言なら活用型、など)
String getPronunciation()
発音
String getReading()
読み
int length()
長さ
int start()
形態素の始まりの位置
int end()
形態素の終わりの位置

Sen を組み込んだプログラムの実行時の注意

まず、java の CLASSPATH に sen.jar と commons-logging.jar が必要。

Sen は実行時に sen.xml という設定ファイルを読み込む。 環境変数 SEN_HOME が正しくしていされている場合には、 以下のようにすることで ${SEN_HOME}/conf/sen.xml が読み込まれる。

$ java -Dsen.home=${SEN_HOME} クラス名 コマンドライン引数...

Sen には Apache Jakarta ProjectCommons コンポーネントの1つである logging ライブラリ が組み込まれている。 何も指定をしないと実行時に読み込んだ辞書の情報などが表示されるが、 気になる場合には、以下のように起動オプションを加えることで抑制される。

$ java -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog ...

NoOpLog というのは、何もしない Log、つまり何も出力しないということ。

サンプル

Sen のパッケージに含まれていて /usr/local/sen/java/src/ にインストールされているサンプルを参考にするとよい。

-Dsen.home=${SEN_HOME} を忘れないように。

文字列として扱う StringTaggerDemo.java がわかれば実用上問題ない。

なお、Sen を用いたプログラムをコンパイルをすると、 推奨されていないものを使っているという警告が出ることがあるが、 コンパイルは正常に終了しているので無視してよい。