形態素解析Senのインストールと使い方

Senのインストールに関してまとめておく。

SenはJavaで書かれているのでJavaは必須だが、ここでは省略。

  • Antの準備

最近はもっぱらMavenばかり使ってたのでAnt入れてなかった...

Apache Ant - Binary Distributions
ここから apache-ant-1.8.3-bin.zip をダウンロード。
任意のディレクトリに解凍、解凍したディレクトリをWindows環境変数ANT_HOMEに登録、PATHに %ANT_HOME%\bin を追加する。
コマンドプロンプトでantが起動するか確かめる。

c:\>ant -version
Apache Ant(TM) version 1.8.3 compiled on February 26 2012

c:\>

残念ながらPerlには明るくない。
Strawberry PerlとActiveState Perlの2種類あるようだが、聞き覚えのあるActiveState Perlをインストールすることにした。

Download and Install Perl Binaries: ActivePerl | ActiveState
ここからActivePerlをダウンロード。現時点の最新バージョンは5.14.2。

インストーラーを起動し、ひたすら [Next] をクリックするのみでOK。
インストールが終わったら、コマンドプロンプトを起動、正常にインストールされたか確認する。

c:\>perl -v

This is perl 5, version 14, subversion 2 (v5.14.2) built for MSWin32-x64-multi-thread
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2011, Larry Wall

Binary build 1402 [295342] provided by ActiveState http://www.ActiveState.com
Built Oct  7 2011 15:19:36

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.


c:\>

Apache Subversion Binary Packages
ここからSubversionをダウンロードしてインストールする。現時点の最新バージョンは1.7.4。
何種類かあるが、どれでも問題ない。
インストーラーを実行、svn.exe があるディレクトリ(例えば C:\Program Files\SlikSvn\bin)をWindows環境変数PATHに追加する。
コマンドプロンプトSubversionが起動するか確かめる。

c:\>svn --version
svn, バージョン 1.7.4-SlikSvn-1.7.4-X64 (SlikSvn/1.7.4) X64
   コンパイル日時: Mar  8 2012, 13:42:47

Copyright (C) 2012 The Apache Software Foundation.
This software consists of contributions made by many people; see the NOTICE
file for more information.
Subversion is open source software, see http://subversion.apache.org/

以下のリポジトリアクセス (RA) モジュールが利用できます:

* ra_neon : Neon を利用して WebDAV (DeltaV) プロトコルでリポジトリにアクセスするモジュール。
  - 'http' スキームを操作します
  - 'https' スキームを操作します
* ra_svn : svn ネットワークプロトコルを使ってリポジトリにアクセスするモジュール。
  - Cyrus SASL 認証を併用
  - 'svn' スキームを操作します
* ra_local : ローカルディスク上のリポジトリにアクセスするモジュール。
  - 'file' スキームを操作します
* ra_serf : serf を利用して WebDAV (DeltaV) プロトコルでリポジトリにアクセスするモジュール。
  - 'http' スキームを操作します
  - 'https' スキームを操作します


c:\>
  • Senの入手

いよいよ本題。以前はsenをzipでダウンロードできたそうだが、2012/5/23現在は入手不可なので最新のソースをSubversionで取得する。

※SenプロジェクトのURL http://java.net/projects/sen

C:\Users\xxx\home>svn co https://svn.java.net/svn/sen~svn/tags/SEN_1_2_2_1/sen
'https://svn.java.net:443' のサーバ証明書の認証中にエラーが発生しました:
 - 証明書は信頼のおける機関が発行したものではありません。証明書を手動で認証
   するためにフィンガープリントを用いてください!
証明書情報:
 - ホスト名: www.java.net
 - 有効範囲: Sun, 19 Sep 2010 15:00:00 GMT から Wed, 19 Sep 2012 14:59:59 GMT まで
 - 発行者: Class 3 MPKI Secure Server CA, VeriSign Trust Network, Sun Microsystems Inc
 - フィンガープリント: 22:d2:d5:43:96:0f:eb:e0:9a:20:b9:14:b4:d9:32:1e:6a:f3:37:11
拒否しますか (R)、一時的に承認しますか (t)、常に承認しますか (p)? t
A    sen\dic
A    sen\dic\dictionary.properties
A    sen\dic\ipa2mecab.pl
A    sen\dic\build.xml
A    sen\dic\compound.pl
A    sen\demo
A    sen\demo\SenBench.java
A    sen\demo\MeCabBench.java
A    sen\conf
A    sen\conf\sen-processor.xml
A    sen\conf\sen.xml
A    sen\lib
A    sen\lib\junit.jar
A    sen\lib\LICENSE.logging
A    sen\lib\LICENSE.junit
A    sen\lib\commons-logging.jar
A    sen\src
A    sen\src\test
A    sen\src\test\dic
A    sen\src\test\dic\compound.dic
A    sen\src\test\custom_dic.csv
A    sen\src\test\testcase
A    sen\src\test\testcase\StringTaggerTest.java
A    sen\src\test\testcase\RemarkProcessorTest.java
A    sen\src\test\testcase\CompositPostProcessorTest.java
A    sen\src\test\testcase\CompoundWordPostProcessorTest.java
A    sen\src\java
A    sen\src\java\ProcessorDemo.java
A    sen\src\java\StringTaggerDemo.java
A    sen\src\java\net
A    sen\src\java\net\java
A    sen\src\java\net\java\sen
A    sen\src\java\net\java\sen\processor
A    sen\src\java\net\java\sen\processor\CompositPostProcessor.java
A    sen\src\java\net\java\sen\processor\PostProcessor.java
A    sen\src\java\net\java\sen\processor\CompoundWordPostProcessor.java
A    sen\src\java\net\java\sen\processor\PreProcessor.java
A    sen\src\java\net\java\sen\processor\RemarkPostProcessor.java
A    sen\src\java\net\java\sen\processor\RemarkPreProcessor.java
A    sen\src\java\net\java\sen\StringTagger.java
A    sen\src\java\net\java\sen\Token.java
A    sen\src\java\net\java\sen\tools
A    sen\src\java\net\java\sen\tools\PairObject.java
A    sen\src\java\net\java\sen\tools\MkCompoundTable.java
A    sen\src\java\net\java\sen\tools\DictionaryMaker.java
A    sen\src\java\net\java\sen\tools\MkSenDic.java
A    sen\src\java\net\java\sen\CToken.java
A    sen\src\java\net\java\sen\Viterbi.java
A    sen\src\java\net\java\sen\Dictionary.java
A    sen\src\java\net\java\sen\Node.java
A    sen\src\java\net\java\sen\StreamTagger.java
A    sen\src\java\net\java\sen\SenUtils.java
A    sen\src\java\net\java\sen\io
A    sen\src\java\net\java\sen\io\FileAccessor.java
A    sen\src\java\net\java\sen\io\RandomAccessReader.java
A    sen\src\java\net\java\sen\io\FullBufferedReader.java
A    sen\src\java\net\java\sen\io\FileAccessorFactory.java
A    sen\src\java\net\java\sen\io\MappedBufferedReader.java
A    sen\src\java\net\java\sen\Tokenizer.java
A    sen\src\java\net\java\sen\ja
A    sen\src\java\net\java\sen\ja\JapaneseTokenizer.java
A    sen\src\java\net\java\sen\resources
A    sen\src\java\net\java\sen\resources\sen.xsd
A    sen\src\java\net\java\sen\util
A    sen\src\java\net\java\sen\util\CSVData.java
A    sen\src\java\net\java\sen\util\CSVParser.java
A    sen\src\java\net\java\sen\util\DoubleArrayTrie.java
A    sen\src\java\net\java\sen\util\DoubleArrayTrie.cpp
A    sen\src\java\StreamTaggerDemo.java
A    sen\bin
A    sen\bin\simplelog.properties
A    sen\bin\sen.bat
A    sen\bin\sen.sh
A    sen\docs
A    sen\build.xml
 U   sen
リビジョン 89 をチェックアウトしました。

C:\Users\xxx\home>
  • Senのビルド

上の続き。このままビルドするとcppコマンドが無いエラーが発生するので、build.xmlの以下の箇所をコメントアウトする。

    <exec executable="cpp" output="${src.dir}/net/java/sen/util/DoubleArrayTrie.java" >
	<arg line="-P ${src.dir}/net/java/sen/util/DoubleArrayTrie.cpp"/>
    </exec>

コメントアウトしたらビルドする。

C:\Users\xxx\home\sen>ant
Buildfile: C:\Users\xxx\home\sen\build.xml

init:
    [mkdir] Created dir: C:\Users\xxx\home\sen\build
    [mkdir] Created dir: C:\Users\xxx\home\sen\build\classes
    [mkdir] Created dir: C:\Users\xxx\home\sen\build\lib

compile:
    [javac] C:\Users\xxx\home\sen\build.xml:59: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 31 source files to C:\Users\xxx\home\sen\build\classes
    [javac] 警告:[options] ブートストラップ・クラスパスが-source 1.3と一緒に設定されていません
    [javac] C:\Users\xxx\home\sen\src\java\net\java\sen\SenUtils.java:158: 警告:この文字は、エンコーディングeuc_jpにマップできません
    [javac]      * unicodeToDATCode("???".toCharArray());
    [javac]                          ^
    [javac] C:\Users\xxx\home\sen\src\java\net\java\sen\SenUtils.java:158: 警告:この文字は、エンコーディングeuc_jpにマップできません
    [javac]      * unicodeToDATCode("???".toCharArray());
    [javac]                           ^
    [javac] C:\Users\xxx\home\sen\src\java\net\java\sen\SenUtils.java:158: 警告:この文字は、エンコーディングeuc_jpにマップできません
    [javac]      * unicodeToDATCode("???".toCharArray());
    [javac]                            ^
    [javac] 警告4個

jar:
     [copy] Copying 1 file to C:\Users\xxx\home\sen\build\classes\net\java\sen\resources
      [jar] Building jar: C:\Users\xxx\home\sen\lib\sen.jar

BUILD SUCCESSFUL
Total time: 4 minutes 43 seconds

C:\Users\xxx\home\sen>

警告が出ているが問題ない。「警告:この文字は、エンコーディングeuc_jpにマップできません」にちょっとびびったが、ソースを見ると思いっきりコメントなので全く問題なし。

  • Senで使う辞書のビルド

上の続き。普通に辞書をビルドするとIPA辞書が使われるが、今回はあえてNAISTの辞書を使ってみる。

http://sourceforge.jp/projects/naist-jdic/releases/
ここから naist-jdic-0.4.3.tar.gz をダウンロードし、C:\Users\xxx\home\sen\dic に解凍する。
解凍したら、フォルダ名を naist-jdic-0.4.3 から ipadic-2.6.0 に変更する(とりあえず以下のbuild.xmlの修正量を減らすため)。
次にbuild.xmlの修正。
perlの実行パスがUNIX用になっているので修正する。

  <!--
  <property name="perl.bin" value="/usr/bin/perl"/>
  -->
  <property name="perl.bin" value="perl"/>

また、辞書ファイルのアーカイブはダウンロード済なので下記2箇所もコメントアウト

    <get src="${ipadic.home}/${ipadic.archive}" dest="${ipadic.archive}" />
    <gunzip src="${ipadic.archive}"/>
    <untar src="${ipadic.dir}.tar" dest="." />
    <delete file="${ipadic.dir}.tar"/>

ビルトする。

C:\Users\xxx\home\sen\dic>ant
Buildfile: C:\Users\xxx\home\sen\dic\build.xml

prepare-proxy:

prepare-archive:

prepare-dics0:

prepare-dics:

download:

melt:

prepare:

dics0:
     [exec] ipadic-2.6.0/naist-jdic.dic ...

create:
     [java] [INFO] MkSenDic - (1/7): reading connection matrix ...
     [java] [INFO] MkSenDic - connection file = connect.csv
     [java] [INFO] MkSenDic - charset = EUC_JP
     [java] [INFO] MkSenDic - (2/7): building type dictionary ...
     [java] [INFO] MkSenDic - (3/7): writing conection matrix (5 x 1940 x 1095 = 10621500) ...
     [java] [INFO] MkSenDic - (4/7): reading morpheme information ...
     [java] [INFO] MkSenDic - load dic: dic.csv
     [java] [INFO] MkSenDic - 50000...
     [java] [INFO] MkSenDic - 100000...
     [java] [INFO] MkSenDic - 150000...
     [java] [INFO] MkSenDic - 200000...
     [java] [INFO] MkSenDic - 250000...
     [java] [INFO] MkSenDic - 300000...
     [java] [INFO] MkSenDic - 350000...
     [java] [INFO] MkSenDic - 400000...
     [java] [INFO] MkSenDic - 450000...
     [java] [INFO] MkSenDic - (5/7): sorting lex...
     [java] [INFO] MkSenDic - (6/7): writing token...
     [java] [INFO] MkSenDic - key size = 456169
     [java] [INFO] MkSenDic - (7/7): building Double-Array (size = 387066) ...
     [java] [INFO] DoubleArrayTrie - save time = 0.107[s]
     [java] [INFO] MkSenDic - total time = 78[ms]

BUILD SUCCESSFUL
Total time: 1 minute 36 seconds

C:\Users\xxx\home\sen\dic>
  • Senを使ってみる

実際に形態素解析できるか確かめる。

C:\Users\xxx\home\sen\lib>set SEN_HOME=C:\Users\xxx\home\sen

C:\Users\xxx\home\sen\lib>java -Dsen.home=%SEN_HOME% -cp sen.jar;commons-logging.jar StringTaggerDemo
done.
Please input Japanese sentence:
5 23, 2012 12:02:48 午前 net.java.sen.Dictionary <init>
情報: token file = C:\Users\xxx\home\sen\dic/token.sen
5 23, 2012 12:02:48 午前 net.java.sen.Dictionary <init>
情報: time to load posInfo file = 16[ms]
5 23, 2012 12:02:48 午前 net.java.sen.Dictionary <init>
情報: double array trie dictionary = C:\Users\xxx\home\sen\dic/da.sen
5 23, 2012 12:02:48 午前 net.java.sen.util.DoubleArrayTrie load
情報: loading double array trie dict = C:\Users\xxx\home\sen\dic/da.sen
5 23, 2012 12:02:48 午前 net.java.sen.util.DoubleArrayTrie load
情報: loaded time = 0.374[ms]
5 23, 2012 12:02:48 午前 net.java.sen.Dictionary <init>
情報: pos info file = C:\Users\xxx\home\sen\dic/posInfo.sen
5 23, 2012 12:02:48 午前 net.java.sen.Dictionary <init>
情報: time to load pos info file = 0[ms]
5 23, 2012 12:02:48 午前 net.java.sen.Tokenizer loadConnectCost
情報: connection file = C:\Users\xxx\home\sen\dic\matrix.sen
5 23, 2012 12:02:48 午前 net.java.sen.Tokenizer loadConnectCost
情報: time to load connect cost file = 47[ms]
すもももももももものうち
すもも  (すもも)        名詞-一般(0,3,3)        スモモ  スモモ
も      (も)    助詞-係助詞(3,4,1)      モ      モ
もも    (もも)  名詞-一般(4,6,2)        モモ    モモ
も      (も)    助詞-係助詞(6,7,1)      モ      モ
もも    (もも)  名詞-一般(7,9,2)        モモ    モモ
の      (の)    助詞-連体化(9,10,1)     ノ      ノ
うち    (うち)  名詞-非自立-副詞可能(10,12,2)   ウチ    ウチ

C:\Users\xxx\home\sen\lib>

Apache Solr入門 ―オープンソース全文検索エンジン

Apache Solr入門 ―オープンソース全文検索エンジン