プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Amazon EC2にmecab

Amazon EC2の使い方をようやく覚えてきたので、アプリのインストールをする事にしてみました。まずは、mecab。Fedora Coreだったらyumでしょうということで、下記のコマンドを試してみました。

# yum -y install mecab mecab-devel mecab-ipadic perl-mecab
Setting up Install Process
Setting up repositories
Reading repository metadata in from local files
Parsing package install arguments
No Match for argument: mecab
No Match for argument: mecab-devel
No Match for argument: mecab-ipadic
No Match for argument: perl-mecab
Nothing to do

 見事にエラー。実はyumのことよく知らない。エラーメッセージを見る限りパッケージのリスト内に、そんなソフト無いよというメッセージです。その辺でやっているyumでのmecabのインストールの仕方をまねしたんだけどなぁと思いつつ、色々試行錯誤してみました。それで気付いたのが、使っているインスタンスがFedora Core4だということ。古すぎる!!
 ということで、まずは別のインスタンスを探して来ることにしました。Fedore Core7ベースで起動して、再度yumでmecabのインストール。

# yum -y install mecab
Loading "installonlyn" plugin
Setting up Install Process
Parsing package install arguments
fedora                    100% |=========================| 2.1 kB    00:00     
primary.sqlite.bz2        100% |=========================| 3.8 MB    00:02     
updates                   100% |=========================| 2.3 kB    00:00     
primary.sqlite.bz2        100% |=========================| 2.3 MB    00:04     
Resolving Dependencies
--> Running transaction check
---> Package mecab.i386 0:0.96-1.fc7 set to be updated

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size 
=============================================================================
Installing:
 mecab                   i386       0.96-1.fc7       updates           440 k

Transaction Summary
=============================================================================
Install      1 Package(s)         
Update       0 Package(s)         
Remove       0 Package(s)         

Total download size: 440 k
Downloading Packages:
(1/1): mecab-0.96-1.fc7.i 100% |=========================| 440 kB    00:00     
warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID 4f2a6fd2
Importing GPG key 0x4F2A6FD2 "Fedora Project <fedora@redhat.com>" from /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing: mecab                        ######################### [1/1] 

Installed: mecab.i386 0:0.96-1.fc7
Complete!

見事、成功!!
他の関係アプリもインストールしておきました。

yum -y install mecab-devel mecab-ipadic perl-mecab

wikipediaのダウンロード&データベースにインポート

ダウンロード

Wikipedia:データベースダウンロード
ウィキペディア日本語版:

jawiki-latest-pages-meta-current.xml.bz2

xml2sqlでmysqldump形式に変換

 wikipediaのコンテンツは、600MB以上ある。それなりに時間が掛かるので、落としている間にデータベースへのインポートの準備。データの提供形態はxmlなので、データベースに入れるにはそれなりの工夫が必要である。幸いwikipedia自体が2種類の方法を提供してくれている。MediaWikiに付属しているimportDump.phpを使うか、xml2sqlというツールをインストールするかが選べる。
 他でも使えそうなので、xml2sqlを使うことにした。
xml2sql

$wget ftp://ftp.tietew.jp/pub/wikipedia/xml2sql-0.5.tar.gz
$tar xzvf xml2sql-0.5.tar.gz
$cd xml2sql-0.5
$./configure
$make
$sudo make install

xml2sqlを使ってxmlをmysqldump形式に変換。

$bunzip2 -c jawiki-latest-pages-meta-current.xml.bz2 | xml2sql 

2.5GB位のtext.txtと、80MB程度のrevision.txt,page.txtが出来る。

ちなみにxml2sqlのオプションは以下の通り。-iがデフォルトで、mysqldumpのフォーマットで出力してくれる。

Options
-i, --import 	mysqlimport format. (default)
Output filenames are page.txt, revision.txt, and text.txt. You can use mysqlimport program to import this format.
-m, --mysql 	MySQL's INSERT format.
Output filenames are page.sql, revision.sql, and text.sql. You can use mysql program to import this format.
-p, --postgresql[=version] 	PostgreSQL's COPY format.
Output filenames are page.sql, revision.sql, and text.sql. If the version is omitted, 8.0 and earlier is assumed. You can use psql program to import this format.
-c, --compress[={old,full}] 	Compress text table with deflate. (default: old)
When output format is postgresql, this option is ignored because PostgreSQL will compress table data itself.
-r, --renumber 	Renumber page id and revision id.
-N, --namespace=ns,ns,... 	Output only specifig namespaces. Namespaces can be specified by both namespace number and namespace name.
-t, --no-text 	Exclude text table
-o, --output-dir=OUTDIR 	Specifies output directory (default: current directory)
-t, --tmpdir=TMPDIR 	Specifies temporary directory (default: OUTDIR)
Temporary file is used only if --compress=old.
-v, --verbose 	Show progress
-h, --help 	Display help and exit
--version 	Display version information and exit

データベースの準備

 残念ながらテーブル作成のSQLまでは作ってくれないので、自前でテーブルを作成する。tables.sqlのページに必要なDDLが書いてある。今回必要なのは、page,revision,textの3つのテーブルだけ。(コーパスと言う意味では、textだけだが。)

create database corpus;
use corpus;

CREATE TABLE page (
  page_id int unsigned NOT NULL auto_increment,
  page_namespace int NOT NULL,
  page_title varchar(255) binary NOT NULL,
  page_restrictions tinyblob NOT NULL,
  page_counter bigint unsigned NOT NULL default '0',
  page_is_redirect tinyint unsigned NOT NULL default '0',
  page_is_new tinyint unsigned NOT NULL default '0',
  page_random real unsigned NOT NULL,
  page_touched binary(14) NOT NULL default '',
  page_latest int unsigned NOT NULL,
  page_len int unsigned NOT NULL,

  PRIMARY KEY page_id (page_id),
  UNIQUE INDEX name_title (page_namespace,page_title),
  
  -- Special-purpose indexes
  INDEX (page_random),
  INDEX (page_len)
);

CREATE TABLE revision (
  rev_id int unsigned NOT NULL auto_increment,
  rev_page int unsigned NOT NULL,
  rev_text_id int unsigned NOT NULL,
  rev_comment tinyblob NOT NULL,
  rev_user int unsigned NOT NULL default '0',
  rev_user_text varchar(255) binary NOT NULL default '',
  rev_timestamp binary(14) NOT NULL default '',
  rev_minor_edit tinyint unsigned NOT NULL default '0',
  rev_deleted tinyint unsigned NOT NULL default '0',
  rev_len int unsigned,
  rev_parent_id int unsigned default NULL,

  PRIMARY KEY rev_page_id (rev_page, rev_id),
  UNIQUE INDEX rev_id (rev_id),
  INDEX rev_timestamp (rev_timestamp),
  INDEX page_timestamp (rev_page,rev_timestamp),
  INDEX user_timestamp (rev_user,rev_timestamp),
  INDEX usertext_timestamp (rev_user_text,rev_timestamp)

)  MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;

CREATE TABLE text (
  old_id int unsigned NOT NULL auto_increment,
  old_text mediumblob NOT NULL,
  old_flags tinyblob NOT NULL,
  
  PRIMARY KEY old_id (old_id)

) MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;

データのインポート

準備が整ったので、いよいよデータのインポート

mysqlimport -u username corpus /dir/data/*.txt

エラーが出た。pageテーブルがuniq制約で引っ掛かってるとのこと。なんでやねん。

mysqlimport: Error: Duplicate entry '0-辰' for key 2, when using table: page

他の二つのテーブルは問題なく上手くいくので、とりあえずuniq制約を外してインポートしてみる。
無事成功。どのレコードが問題なのか調べてみる。

select page_namespace,page_title,count(*) from page group by page_namespace,page_title having count(*) > 1;
+----------------+------------+----------+
| page_namespace | page_title | count(*) |
+----------------+------------+----------+
|              0 |            |        2 |
|              0 | 辰         |        2 |
|              2 |            |        2 |
+----------------+------------+----------+
3 rows in set (10.60 sec)

放置決定。これにて、データベースへのインポートは終了。次は、これからコーパスの作成へ

PerlでCaboCha

Gentooにcabochaをインストール。
ついでに、Perlから使おうと思ってCaboCha.pmをコンパイルしようとすると

#cd cabocha-0.53/perl/
#perl Makefile.PL
WARNING: Setting VERSION via file 'CaboCha.pm' failed
 at /usr/lib/perl5/5.8.7/ExtUtils/MakeMaker.pm line 486
Note (probably harmless): No library found for -lstdc++
Note (probably harmless): No library found for -lstdc++
Writing Makefile for CaboCha
  • lstdc++が見つからないけど、たぶん大丈夫だよと言うメッセージ。

こういう場合で大丈夫だったためしがないので、インストールしておく。

  • lstdc++というライブラリは、lib-compatに含まれている模様。

コンパイルは結構時間が掛かる。色々含まれてるのね。

#emerge lib-compat

テストプログラムを実行

$cd cabocha-0.53/perl/
$chmod 755 test.pl
$./test.pl
cabocha_new(): Parser::open (): ChaSen::open(): Cannot load dynamic link library: libchasen.so

ChaSenのライブラリをロード出来ないらしい。
Makefile.PLを直接編集

#vi Makefile.PL
'LIBS' => '-L/usr/local/lib -lchasen -lyamcha -lm -lstdc++ -lstdc++ -lc -ldl -lcabocha',
(-lchasenを追加)
#perl Makefile.PL
#make
#make install
$ ./test.pl
<PERSON>太郎</PERSON>は-----------D
                     この-D       |
                       本を-------D
                       二郎を-D   |
                           見た-D |
                           女性に-D
                           渡した。
EOS
<PERSON>太郎</PERSON>は-----------D
                     この-D       |
                       本を-------D
                       二郎を-D   |
                           見た-D |
                           女性に-D
                           渡した。
EOS
* 0 6D 0/1 3.48189078
太郎    タロウ  太郎    名詞-固有名詞-人名-名                   B-PERSON
は      ハ      は      助詞-係助詞                     O
* 1 2D 0/0 1.43158205
この    コノ    この    連体詞                  O
* 2 6D 0/1 5.53720344
本      ホン    本      名詞-一般                       O
を      ヲ      を      助詞-格助詞-一般                        O
* 3 4D 0/1 2.25728537
二郎    ニロウ  二郎    名詞-固有名詞-一般                      O
を      ヲ      を      助詞-格助詞-一般                        O
* 4 5D 0/1 0.98494995
見      ミ      見る    動詞-自立       一段    連用形  O
た      タ      た      助動詞  特殊・タ        基本形  O
* 5 6D 0/1 0.00000000
女性    ジョセイ        女性    名詞-一般                       O
に      ニ      に      助詞-格助詞-一般                        O
* 6 -1O 0/1 0.00000000
渡し    ワタシ  渡す    動詞-自立       五段・サ行      連用形  O
た      タ      た      助動詞  特殊・タ        基本形  O
。      。      。      記号-句点                       O
EOS
* 0 6D 0/1 3.481891
太郎    太郎    タロウ  名詞-固有名詞-人名-名                   B-PERSON
は      は      ハ      助詞-係助詞                     O
* 1 2D 0/0 1.431582
この    この    コノ    連体詞                  O
* 2 6D 0/1 5.537203
本      本      ホン    名詞-一般                       O
を      を      ヲ      助詞-格助詞-一般                        O
* 3 4D 0/1 2.257285
二郎    二郎    ニロウ  名詞-固有名詞-一般                      O
を      を      ヲ      助詞-格助詞-一般                        O
* 4 5D 0/1 0.984950
見      見る    ミ      動詞-自立       一段    連用形  O
た      た      タ      助動詞  特殊・タ        基本形  O
* 5 6D 0/1 0.000000
女性    女性    ジョセイ        名詞-一般                       O
に      に      ニ      助詞-格助詞-一般                        O
* 6 -1O 0/1 0.000000
渡し    渡す    ワタシ  動詞-自立       五段・サ行      連用形  O
た      た      タ      助動詞  特殊・タ        基本形  O
。      。      。      記号-句点                       O
EOS

無事、成功。

chasen,cabochaのインストール

ちょっと必要に迫られて、日本語係り受け解析器CaboChaのインストール
形態素解析器は、Mecabにしようかと思ったのですが、故あってChasenを選択。

Dartsのインストール

Casenに必要です。機能は、以下の通り。

Darts は, Double-Array [Aoe 1989]を構築するための シンプルな C++ Template Library です.

インストールは以下の通り。簡単。

#wget http://chasen.org/~taku/software/darts/src/darts-0.3.tar.gz
#./tar xzvf darts-0.3.tar.gz
#cd darts-0.3
#./configure
#make
#make check
#make install

Chasenのインストール

gccのバージョンが、3.4.3以上だとコンパイルが上手く通りません。
多少、ソースに手を加える必要があります。
詳しく解説して、パッチまで作っておられる方がいました。
ミクロトーク

#wget http://chasen.aist-nara.ac.jp/stable/chasen/chasen-2.3.3.tar.gz
#tar xzvf chasen-2.3.3
#cd chasen-2.3.3
#./configure
#vi lib/dartsdic.cpp
#make
#make check
#make install
180c180,181
< (const char*)keys[size] = key.data();
---
> // (const char*)keys[size] = key.data();
> keys[size] = (char*)key.data();

71c71,72
< darts->setArray(cha_mmap_map(da->da_mmap));
---
> // darts->setArray(cha_mmap_map(da->da_mmap));
> darts->set_array(cha_mmap_map(da->da_mmap));

TinySVMのインストール

TinySVMのインストール。TinySVMとは、所謂Support Vector Machinesです。
ベクトル空間に単語を配置して、その境界を定めます。
機械学習の道具として使われることが多いです。
まぁ、こんな物を次から次へと作る、工藤拓さんってホント凄いなぁ。

#wget http://chasen.org/~taku/software/TinySVM/src/TinySVM-0.09.tar.gz
#tar xzvf TinySVM-0.09.tar.gz
#cd TinySVM-0.09
#./configure
#make
#make check
#make install

YamChaのインストール

YamChaのインストール。もう少し。。

#http://chasen.org/~taku/software/yamcha/src/yamcha-0.33.tar.gz
#tar xzvf yamcha-0.33.tar.gz
#cd yamcha-0.33
#./configure
#make
#make check
#make install

CaboChaのインストール

いよいよCacoChaのインストールです。これも簡単。
でも、コンパイルに結構時間がかかります。

#wget http://chasen.org/~taku/software/cabocha/src/cabocha-0.53.tar.gz
#tar xzvf cabocha-0.53.tar.gz
#cd cabocha-0.53
#./configure
#make
#make install

早速、試してみる

$cabocha
cabocha: error while loading shared libraries: libcabocha.so.2: cannot open shared object file: No such file or directory

どうやら、ライブラリがロード出来ていないようなので、rootになってロード

#ldconfig

再度、試してみる
chasenrcが無いよとのことです。仰る通り。

$cabocha
chasen: can't open .chasenrc, .jumanrc, or /usr/local/etc/chasenrc
chasen: ./grammar.cha: No such file or directory

Chasenの設定

ようやくChasenの設定。
辞書を作ります。ついでに、後々のことを考えて、辞書をUTF-8に変換しておきます。
ipadicの*.dic、*.chaファイルを全てnkfを使って変換すれば大丈夫です。
簡単なシェルを作りました。chasenrcも変換します。
何故か、*.dicファイルがコピーされなかったのので、手動でコピー。

#wget http://chasen.naist.jp/stable/ipadic/ipadic-2.7.0.tar.gz
#tar xzvf ipadic-2.7.0.tar.gz
#cd ipadic-2.7.0
#vi utf_conv.sh
#chmod 755 utf_conv.sh
#./configure
#make
#make install
#cd /usr/local/lib/chasen/dic/ipadic/
#cp /usr/local/src/ipadic-2.7.0/*.dic ./
#`chasen-config --mkchadic`/makemat -i w
#`chasen-config --mkchadic`/makeda -i w chadic *.dic

# cp /usr/local/src/ipadic-2.7.0/chasenrc /usr/local/etc/
# cd /usr/local/etc/
# nkf -w chasenrc > tmp
# mv tmp chasenrc 
utf_conv.sh

#!/bin/sh

for file in `ls *.dic *.cha`
do
  echo $file
  nkf -w $file > tmpfile
  mv tmpfile $file
done
exit

Chasenを使ってみる

cat hoge.txt | chasen -iw
おっけい。

CaboChaを使ってみる

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

しまった。CaboCha経由で使う場合、chasenにUTFオプションが送れない。どないしましょう。