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)