Wednesday,September 7

よみがな自動処理への道【5】PerlとMeCabはパイプでつながる

さて、いよいよ。
PerlでMeCabを利用していくお話です。

過去においては、PerlからMeCabを利用するためのモジュール(便利な関数が詰まったライブラリのようなもの)が出回っていたらしいですが、見つけることができませんでした。また、そのモジュールも直近のMeCabのバージョンだとコンパイルが通らないとか、直近のMeCabだとライブラリが足りないとか、いろいろ不都合があるらしく、モジュールを利用しようとするとかなりテクニカルなことになりそうです。

はい、モジュール使いません。
使いませんとも。
そんなややこしいことしたくありません。

これまでのログでコマンドプロンプトでMeCabは使えるようにしたわけですから、とにかくPerlからシステムコマンドさえ送信できれば、モジュールなしでもなんとかなると思いました。

そして、MeCabを配布しているサイトの仕様をじっくり読むと、「MeCabコマンドの引数にファイルを与えると、そのファイルが解析対象となる」と書いてあります。

MeCabの使い方
http://taku910.github.io/mecab/#usage-tools

この仕様はかなり使えます。
よみがなを得たい文字列、あるいは形態素解析をしたい文字列を、いちどファイルに保存して、それをMeCabコマンドの引数として与えてやれば、得たいデータが得られるわけです。

PerlでMeCabを利用する場合、この仕様を利用することにします。

まず、どんな長文でもいいですから形態素解析をしたい文字列をすべて絶対パスが特定できるファイルに保存します。そのうえでPerlで以下のコードを書いてやればMeCabにコマンドを送れます。


open(MECAB,'mecab '.'"(形態素解析させるファイルの絶対パス)"'.'|');

openは基本的にはファイルオープン関数ですが、パイプ(この場合は最後の「|」)を用いることでシステムコマンドとして利用できます。
Perlではopenの先頭にパイプを使えば結果は返ってきませんが、最後尾にパイプをつけるとコマンドを送った結果が返ってきてファイルハンドラに格納されます。この場合ファイルハンドラは「MECAB」です。
コマンドに送る絶対パスはダブルコーテーションで囲んでおくと確実です。

結果をえる時は、たとえばこう。


@Mecab_Line=();
@Mecab_Line=<MECAB>;

@は配列です。
MeCabの解析結果は複数の行にわたって出力されます。
その行ごとに配列の要素に格納されます。


while(<MECAB>){
(やりたい処理)
}

という書き方もできますが、どれくらいの量でどのような返答結果となるかわからないときにwhile文でのループで囲むのは、個人的にあまり好きな書き方ではありません。それに、(やりたい処理)が終わるまでwhileループから抜けだせず、ファイルのclose処理が後回しになってしまいます。

Perlでは、open関数でファイルハンドラを使ったらclose処理でファイルハンドラを解放してあげます。Perlはclose処理をしなくてもファイルハンドラが不要となった時点(プロセス終了時?)に自動でファイルハンドラを解放する仕様にもなっているようですが、コードに書いて任意のタイミングでclose処理した方が便利です。

したがって、ファイルハンドラに格納された結果をいちど配列にコピーして即座にclose処理をしてファイルハンドラを解放、そのあとで配列を見ることでやりたい処理をするのが妥当だと思います。


まとめます。

Perlでよみがな処理をするためにMeCabにコマンドを送るためには、形態素解析をしたい文字列をファイルに保存したうえで、以下のコードを書きます。


open(MECAB,'mecab '.'"(形態素解析させるファイルの絶対パス)" -O yomi2'.'|');

@Mecab_Line=();
@Mecab_Line=<MECAB>;

close(MECAB);

foreach(@Mecab_Line){
(やりたい処理)
}

mecabコマンドにファイルの絶対パスと、よみがな処理するための「yomi2」オプションが付きました。返答結果を処理しやすいシンプルな形にするためです。

配列をforeachで回しているのは、ダブルシステムのローカルとサーバとではPerlのバージョンが違うためです。Perlは新バージョンでとても便利なコードの書き方ができるようになりましたが、旧バージョンで新しい書き方をするとエラーとなります。多少面倒くさくても、新旧いずれのバージョンでも動作するコードを書くようにしています。


≫ NEXT_LOG よみがな自動処理への道【6】全角カタカナ→全角ひらがな

≪ PREV_LOG よみがな自動処理への道【4】ローカルとサーバのダブルシステム(01 photos)

PAGE UP

Google+

スタジオムーンリーフ(2005年1月開設/Since 2005)
代表者:野口 卓洋(Takuhiro Noguchi)
Add:356-0006 埼玉県ふじみ野市霞ヶ丘3-1-22-504

Twitter:@StudioMoonLeaf
Facebook:facebook.com/noguchi.takuhiro


©2017 STUDIO MOON LEAF ALL RIGHTS RESERVED.