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.