スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Comment (-)

Win機に茶筅をインストール(3) Cygwin にChaSen を2つの文字コードで

(1) (2) からの続きです。

Cygwin に ChaSen を 2種類の文字コードを切り替えて使用できるようにインストールした手順について、ここメモしておく。 ( すぐ下の [続きを読む] ボタンでこの記事のすべてを表示 )

以下の順序で Darts, chasen, Text::ChaSen, ipadic を
インストールし、, ipadic 辞書データをコンパイルする。

■Cygwin上で茶筅用にインストールしたもの一覧

* darts-0.32.tar.gz 茶筅の動作に必要なライブラリ
* libiconv-1.14.tar.gz ← これはCygwinに最初からインストールしていた
* chasen-2.4.5.tar.gz (茶筅本体)
    これには茶筅の perlモジュール Text::ChaSen の
    ソースも含まれるが chasen 本体のインストールでは
    インストールされない。後で手動でインストール。
* ipadic-2.7.0.tar.gz (日本文切り分け用の辞書)
* ipadic 用のユーザー辞書(以前に自分で作成したもの)

・パッケージがインストール済みかどうか確認するには
正確なパッケージ名が分かっている場合。
$ cygcheck -c libiconv
Cygwin Package Information
Package Version Status
libiconv 1.14-3 OK


・正確なパッケージ名が分からない場合は
$ cygcheck -c | grep cyg  

    ※このようにgrep指定すると遅い

・コマンドがインストール済みかどうか確認
コマンド名のうしろに --help --version  -l  --list など
$ iconv --version
iconv (GNU libiconv 1.14)

     iconv コマンド有効。インストール済み

・libiconv がCygwinになければ追加インストールできる
私の場合は、Cygwinのインストール時に、必要なパッケージを選択する画面でlibiconv を検索して、最初からインストールに含めておいた。
Cygwinの セットアップ.exe を再実行して追加インストールすることもできる。私はむしろCygwinに余計なパッケージをインストールしすぎたので、後でCygwinの セットアップ.exe を実行して、明らかに不要だろうと思われるパッケージを Uninstall した。

■Cygwin と ubuntu の違い

詳しいことは知らない(解説書も読んでいない)。単に、素人の私が実際にChaSenをインストールする立場で感じた Cygwin と ubuntu の違いだけを書いてみると…

・ディレクトリ構造が若干違うことがある
ダウンロードした tar.gz を、一般に
ubuntuでは /usr/local/src/ 下に置いて展開するのが標準。
Cygwinでは /usr/src/ 下で展開する。

・Cygwin では管理者権限を気にしなくてよい
Cygwin ではシステムディレクトリ内での書き込み・変更を行うコマンドでも su とか sudo なしで実行できる( Windows の管理者アカウントでログインしている場合だけなのかどうか知らないけれど)。

・Cygwinのほうが Windows とのファイルやりとりが楽
Windows のエクスプローラでCygwinフォルダに普通にアクセスできる。

■ Darts のインストール

http://chasen.org/~taku/software/darts/
Darts: Double-ARray Trie System darts-0.32.tar.gz

tar.gz ファイルを /usr/src/ の下に展開してインストール。
$ cd /usr/src
$ tar -xvzf darts-0.32.tar.gz
$ cd darts-0.32
$ ./configure
$ make
$ make install

Cygwin でも問題なく終了

■ chasen のインストール

既定のインストール先にインストールする。
インストール時には、使用文字コードをオプション指定する必要はない。
$ cd /usr/src
$ tar -xvzf chasen-2.4.5.tar.gz
$ cd chasen-2.4.5
( $ make clean )
./configure LDFLAGS="-liconv" #このLDFLAG= 指定についてはすぐ下にメモ.
$ make
$ make install

 なお、 ./configure のオプションを指定したい場合は、空白で区切って並べる。

●chasenのmake時に libiconvの場所が認識できないエラー

次のような「 undefined reference to 」エラーが出た。
../lib/.libs/libchasen.a(literal.o): In function `jlit_init':
/usr/src/chasen-2.4.5/lib/literal.c:202: undefined reference to `libiconv_open'
/usr/src/chasen-2.4.5/lib/literal.c:202:(.text+0x6b): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv_open'
/usr/src/chasen-2.4.5/lib/literal.c:220: undefined reference to `libiconv'
/usr/src/chasen-2.4.5/lib/literal.c:220:(.text+0xd6): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv'
/usr/src/chasen-2.4.5/lib/literal.c:231: undefined reference to `libiconv_close'
/usr/src/chasen-2.4.5/lib/literal.c:231:(.text+0x15a): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `libiconv_close'
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:234: chasen.exe] Error 1
make[2]: Leaving directory '/usr/src/chasen-2.4.5/chasen'
make[1]: *** [Makefile:264: all-recursive] Error 1
make[1]: Leaving directory '/usr/src/chasen-2.4.5'
make: *** [Makefile:186: all] Error 2

このエラーについて
「2012-01-07 C/C++でundefined reference toエラーが出る場合」by Hiroyuki-Nagataさん
http://nantonaku-shiawase.hatenablog.com/entry/20120107/1325961201

「cygwin 環境に chasen を install 2013秋」by fullmoonhalf さん
http://matome.naver.jp/odai/2138155655759514401

によると、./configure するときに 次にように LDFLAGS= を指定しておけばよいとのこと。
$ ./configure LDFLAGS='-L/usr/local/lib -liconv' 

おかげで解決した。お二人に感謝!

■ 「Text::ChaSen」perl モジュールのインストール

chasen-2.4.5.tar.gz を展開したディレクトリ下の /perl からインストールする

$ cd /usr/src/chasen-2.4.5/perl 


chasen-2.4.5/perl 下にある Makefile.PL をエディタで次のように修正:

Makefile.PL の修正前
use ExtUtils::MakeMaker;

WriteMakefile(
'NAME' => 'Text::ChaSen',
'VERSION_FROM' => 'ChaSen.pm',
'LIBS' => ['-lchasen']
);


Makefile.PL の修正後 ( libchasen.a が /usr/local/lib にある場合 )
use ExtUtils::MakeMaker;
WriteMakefile(
'NAME' => 'Text::ChaSen',
'VERSION_FROM' => 'ChaSen.pm',
'LIBS' => ['-L/usr/local/lib -lchasen -liconv']
);
      ここ↑の追加と、 Cygwinでは↑これも追加


$ perl Makefile.PL 
$ make
$ make install


・Cygwinでは Makefile.PL を上記のように修正しないと次のエラーが出た
/perl/Makefile.PL の実行で
undefined reference to `libiconv_open'
undefined symbol `libiconv_open'
など
libiconv が見つからないエラー。そこで Makefile.PL 内の
'LIBS' => に次のように -liconvも追加した。
  'LIBS' => ['-L/usr/local/lib -lchasen -liconv']


■ipadic を2つの文字コードでCygwinにインストールする準備

ubuntuでは、ipadicインストール用のソース ファイルだけは、後で編集しやすいように管理者権限不要なホームディレクトリ下に展開した。
Cygwinではシステム ディレクトリもアクセスが楽なので、標準の /usr/src/ に展開して配置しておいても構わないかもれないが、管理のしやすさを考えて結局ホームディレクトリに展開することにした。

●文字コード別にipadicをインストールするためのディレクトリ計画

・ipadic ソース展開フォルダ (文字コード別に2つ)
/home/hoge/src/ipadic270-utf8/
/home/hoge/src/ipadic270-sjis/

・ipadic システムインストール先 (文字コード別に2つ)
インストール時のオプションでインストール先ディレクトリを指定すると、指定したディレクトリの下に自動的に /ipadic サブディレクトリが作成され、そこに文法定義ファイル *.cha や システム辞書のコンパイルデータ chadic.* が入れられる。それをふまえて次のようにディレクトリを指定することに決めた。
--with-dicdir=/usr/local/lib/cha-utf8/ipadic #末尾に/ipadic が付加される
--with-dicdir=/usr/local/lib/cha-sjis/ipadic
# 〃
( ちなみにデフォルトでは /usr/local/lib/chasen/dic/ipadic )

・ipadic ユーザー辞書(&ソース)の場所 (文字コード別に2つ)
/home/hoge/mycha-utf8/(chadic.* 、*.dic ファイル)
/home/hoge/mycha-sjis/(chadic.* 、*.dic ファイル)

・Home に置く .chasen2rc の定義
使用する文字コードによって、次のようにするつもり
.chasen2rc
;(文法ファイル /usr/local/lib/chasen/dic/ipadic);
(GRAMMAR /usr/local/lib/cha-utf8/ipadic) または
(GRAMMAR /usr/local/lib/cha-sjis/ipadic)
;;; dictionary /辞書
;(DADIC chadic)
(DADIC chadic /home/hoge/mycha-utf8/chadic) または
(DADIC chadic /home/hoge/mycha-sjis/chadic)


参考にしたページはここ

●ソースを2つの文字コードで各フォルダに展開

$ cd ~
$ mkdir src
$ cd src #( ここに .tar.gz ファイル)
$ tar -zxvf ipadic-2.7.0.tar.gz
$ mv ipadic-2.7.0 ipadic270-utf8 #ディレクトリ名変更 ( / 記号付けない)

$ tar -zxvf ipadic-2.7.0.tar.gz
$ mv ipadic-2.7.0 ipadic270-sjis #ディレクトリ名変更 ( / 記号付けない)


次は、ソースファイルの文字コード変換

●ソースファイルの文字コード変換 (EUC以外でインストールする場合)

・.tar.gz 展開先ディレクトリに出来たシステム辞書などのファイルを
目的の文字コードに変換する。

ipadic270-utf8 内の *.dic 、*.cha 、chasenrc を UTF-8 に変換
ipadic270-sjis 内の *.dic 、*.cha 、chasenrc を Shift-JISに変換

*.dic 27個 *.cha 4個 chasenrc 1個 計32ファイル。

変換後の改行コードはいずれも LF にする。でないと make でエラーに。

・以前に自分で編集したシステム辞書があれば上書き
さらに、私の場合は、以前に自分で編集したシステム *.dic 辞書があるので、それらもそれぞれの文字コードに変換し、展開先ディレクトリに 上書きする。

■【UTF-8用】にipadic辞書インストール&ユーザー辞書コンパイル

●Cygwin 端末の文字コード設定をUTF-8に変更する
やり方は、端末の上枠を右クリックして Options → Text → Local に [ja-jp]、Character set に [UTF-8] を選択 → [Save] → 端末をいったん閉じてまた開く。

●ipadic のインストール
$ cd ~/src/ipadic270-utf8
$ `chasen-config --mkchadic`/makemat -i w
$ `chasen-config --mkchadic`/makeda -i w chadic *.dic
$ ./configure --with-dicdir=/usr/local/lib/cha-utf8
$ make
$ make install


もしもエラーが出たら、まずは *.dic *.cha chasenrc ファイルの文字コードと改行コードが正しくない可能性を疑ってみる。

●chasenrc ファイルを編集して設定変更
/usr/local/etc/chasenrc を編集するか、または
インストール先 /usr/local/lib/cha-utf8/ipadic 内の chasenrc を
Home にコピーし .chasen2rc として編集する。
ファイルの文字コードに注意!

.chasen2rc
;(文法ファイル /usr/local/lib/chasen/dic/ipadic);
(GRAMMAR /usr/local/lib/cha-utf8/ipadic)
;;; dictionary /辞書
;(DADIC chadic)
(DADIC chadic /home/hoge/mycha-utf8/chadic)


● UTF-8 用に ユーザー辞書をコンパイル
$ cd ~
$ mkdir mycha-utf8 #ここに自分の辞書 *.dic を入れる.
$ cd /mycha-utf8
$ `chasen-config --mkchadic`/makeda -i w chadic *.dic
# (-i オプション e:EUC-JP, s:Shift JIS, w:UTF-8, a:ISO-8859-1
# xxxxx.dic.bak などのファイルが同ディレクトリ内にあるとエラー)
$ chasen-config --mkchadic



■【SJIS用】にipadic辞書インストール&ユーザー辞書コンパイル

●Cygwin 端末の文字コード設定をSJISに変更する
UTF-8 の場合とやり方は同じ

●ipadic のインストール
$ cd ~/src/ipadic270-sjis
$ `chasen-config --mkchadic`/makemat -i w
$ `chasen-config --mkchadic`/makeda -i w chadic *.dic
$ ./configure --with-dicdir=/usr/local/lib/cha-sjis
$ make
$ make install


もしもエラーが出たら、まずは *.dic、*.cha、chasenrc ファイルの文字コードと改行コードが正しくない可能性を疑ってみる。

●chasenrc ファイルを編集して設定変更
/usr/local/etc/chasenrc を編集するか、または
インストール先 /usr/local/lib/cha-sjis/ipadic 内の chasenrc を
Home にコピーし .chasen2rc として編集する。
ファイルの文字コードに注意!

.chasen2rc
;(文法ファイル /usr/local/lib/chasen/dic/ipadic);
(GRAMMAR /usr/local/lib/cha-sjis/ipadic)
;;; dictionary /辞書
;(DADIC chadic)
(DADIC chadic /home/hoge/mycha-sjis/chadic)


chasenrc (.chasen2rc) の文字コードとフォルダ指定を sjis 用に変えておかないと、次のユーザー辞書作成の `chasen-config ... でエラーになる。
ユーザー辞書のコンパイルでは /makeda が chasenrc を頼りに chasen の grammer.chaなどを探しに行くようだ。

● SJIS 用に ユーザー辞書をコンパイル
$ cd ~
$ mkdir mycha-sjis #ここに自分の辞書 *.dic を入れる.
$ cd /mycha-sjis
$ `chasen-config --mkchadic`/makeda -i w chadic *.dic
# (-i オプション e:EUC-JP, s:Shift JIS, w:UTF-8, a:ISO-8859-1
# xxxxx.dic.bak などのファイルが同ディレクトリ内にあるとエラー)
$ chasen-config --mkchadic


・エラー: UTF-8用のchasenrcのままの場合:
 Hoge@MR6700 /home/hoge/mycha-sjis
$ `chasen-config --mkchadic`/makeda -i s chadic *.dic

で次のエラーになる。
parsing /usr/local/lib/cha-utf8/ipadic/grammar.cha
/usr/local/libexec/chasen/makeda: /usr/local/lib/cha-utf8/ipadic/grammar.cha:10-109: premature end of file or string


■文字コード別に複数インストールした chasen用 ipadic の使い分け

次の2点を変更するだけで、chasenで使用する文字コードを使い分けられる

1) /usr/local/etc/chasenrc または /home/hoge/.chasen2rc を
utf8用、Shift-JIS用などに変更する。
あらかじめ別名でそれぞれ作っておいて、使用したいファイルで
chasenrc または .chasen2rc を上書きするとよい。

2) 端末の表示文字コード設定を変更する。

■テスト コマンドの例

端末に直接日本語を入力する場合は 端末出力の文字コード設定を合わせて
$ chasen -i w #(UTF-8の場合)
$ chasen -i s #(S-JISの場合)
#ここで日本語文を入力し、Enter。最後に Ctrl-C で終了。

$ echo "今回は日本語を扱う上で欠かせないツールをご紹介" | chasen -i w
$ echo "今回は日本語を扱う上で欠かせないツールをご紹介" | chasen -i s

$ chasen -i w test-utf.txt
$ chasen -i s test-sjis.txt

$ perl -w test-utf.pl
$ perl -w test-sjis.pl



==== test_utf8.pl スクリプトの中身 ====
#!/usr/bin/perl
use Text::ChaSen;

Text::ChaSen::getopt_argv('chasen-perl', '-iw');
$str = Text::ChaSen::sparse_tostr("日本語の文字列");

print "$str\n\n";

exit;
#


■テスト実行時にありがちなエラー

●UTF-8 設定のとき (.chasen2rc内で utf8のipadic辞書を指定) の実行エラー:

chasen: /usr/local/lib/cha-utf8/ipadic/cforms.cha:9-21: no basic form


このエラーは chasen の文字コードオプションを指定し忘れたり、
指定のしかたが無効だったりした場合に表示される。
perl ( .pl スクリプトファイル内) で Text::ChaSen のオプション指定に '-i w' と空白を開けて指定しても同じエラーになる。perl では '-iw' のように詰めて指定しないといけない。

chasen: /usr/local/lib/cha-utf8/ipadic/grammar.cha:10-109: premature end of file or string

これは、.chasen2rc がUTF-8用なのに間違って -i s (Shift-JIS) を指定してしまったとき。

●S-JIS 設定のとき (.chasen2rc内で SJISのipadic辞書を指定) の実行エラー:

chasen: /usr/local/lib/cha-sjis/ipadic/grammar.cha:10-114: premature end of file or string


このエラーは、chasenrc が s-jis 用の設定なのに -i w (UTF-8) を指定したり、
perl ( .pl スクリプトファイル内) で Text::ChaSen のオプション指定に '-i s' と空白を開けて指定した場合。

だいたいこんな感じ。
スポンサーサイト
Comment (-)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。