PHPについて質問致します。

形態素解析を行うにあたっていくつかの形態素解析エンジンを比較していった結果、
MeCab(http://mecab.sourceforge.jp/)を使用することに致しました。
コマンドライン上で動かすことはできるのですが、
PHPからMeCabを使用するサンプルが見つからないため、
どのようにしたらMeCabの結果をPHPで取得できるかわかりません。
参考になるコードを教えていただけないでしょうか。
テストしている環境はWindows2000, Apache 1.x, PHP 4.x, MeCab 0.9.3となっております。
よろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/01/09 11:41:33
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:bayan No.3

回答回数100ベストアンサー獲得回数13

ポイント250pt

mecab にテキストを渡すのに、入力ファイルを作らない方法ということで、

パイプ経由での読み書きを試してみました。

proc_open() 関数を使っています。

http://www.php.net/manual/ja/function.proc-open.php

$text = "すもももももももものうち";

$mecabpath = 'C:\Progra~1\MeCab\bin\mecab.exe';

$descriptorspec = array(

0 => array("pipe","r"), // stdin は mecab が読み込むパイプ

1 => array("pipe","w") // stdout は mecab が書き込むパイプ

);

$process = proc_open($mecabpath, $descriptorspec,$pipes);

if(is_resource($process)){

// $pipes はこの時点で次のような形を取っています。

// 0 => mecab の stdin に繋がれた書き込み可能なハンドル

// 1 => mecab の stdout に繋がれた読み込み可能なハンドル

fwrite($pipes[0], $text);

fclose($pipes[0]);

while(!feof($pipes[1])){

$result .= fread($pipes[1], 4096);

}

fclose($pipes[1]);

proc_close($process);

echo $result;

}

$result にmecabの出力が格納されているかと思います。

id:federal

ご回答ありがとうございます。

popenのような関数を使うことは検討がついていたのですが、

マニュアルを拝見しても理解できずに頓挫していました。。。

おかげさまで、回答2:GEN111さんの掲示されたコードを参考にして作成しました、

文字列→ファイル作成→解析→ファイル削除という流れのスクリプトより、

3~10倍近く実行時間が短くなりました。

ご回答いただいた皆様、ありがとうございました。

2007/01/09 11:39:56

その他の回答2件)

id:takagimasahiro No.1

回答回数23ベストアンサー獲得回数2

ポイント50pt

Visual Studio 6 をお持ちでしたら、php_mecabを使うのがいちばん手っ取り早いのではないかと思います。

id:federal

ご回答ありがとうございます。

ご掲示いただいたWebサイトは既に拝見しておりましたが、

Windows環境ではどのようにしたら活用できるのかわかりませんでした。

また、Visual StudioはC# 2005 Express Editionしか持っておりませんので、

Visual Studio 6の指定となると、申し訳ありませんが使うことができません。。。

2007/01/07 19:21:17
id:GEN111 No.2

回答回数472ベストアンサー獲得回数58

ポイント150pt

ちょっと試してみました。

$mecabpath = 'C:\Progra~1\MeCab\bin\mecab.exe' ; // mecab のパス
$inputfile = '"C:\test\test.txt"' ; // input ファイル

exec("$mecabpath $inputfile", $result) ;

これで $result に結果が保存されていると思います。

id:federal

ご回答ありがとうございます。

ご掲示していただいたコードを参考にさせていただいたところ、

とりあえず動作するものを作成することができました。

そこでさらに質問なのですが、

入力をファイルで行うのではなく、文字列を用いることによって実現することはできないでしょうか?

データベース(MySQL)に文章が既に用意されているのですが、

解析の度にファイルを作成→解析では、スマートではないように思えます。

また、文字コードがコマンドラインを経由するためか、

Shift-JISでないと文字化けが起こり正しく結果が出ません。

これまでのスクリプトは、全てEUC-JPで作成してきたので、

できればEUC-JPのみを使用して作成したいのですが可能でしょうか?

よろしくお願いいたします。

2007/01/07 19:58:03
id:bayan No.3

回答回数100ベストアンサー獲得回数13ここでベストアンサー

ポイント250pt

mecab にテキストを渡すのに、入力ファイルを作らない方法ということで、

パイプ経由での読み書きを試してみました。

proc_open() 関数を使っています。

http://www.php.net/manual/ja/function.proc-open.php

$text = "すもももももももものうち";

$mecabpath = 'C:\Progra~1\MeCab\bin\mecab.exe';

$descriptorspec = array(

0 => array("pipe","r"), // stdin は mecab が読み込むパイプ

1 => array("pipe","w") // stdout は mecab が書き込むパイプ

);

$process = proc_open($mecabpath, $descriptorspec,$pipes);

if(is_resource($process)){

// $pipes はこの時点で次のような形を取っています。

// 0 => mecab の stdin に繋がれた書き込み可能なハンドル

// 1 => mecab の stdout に繋がれた読み込み可能なハンドル

fwrite($pipes[0], $text);

fclose($pipes[0]);

while(!feof($pipes[1])){

$result .= fread($pipes[1], 4096);

}

fclose($pipes[1]);

proc_close($process);

echo $result;

}

$result にmecabの出力が格納されているかと思います。

id:federal

ご回答ありがとうございます。

popenのような関数を使うことは検討がついていたのですが、

マニュアルを拝見しても理解できずに頓挫していました。。。

おかげさまで、回答2:GEN111さんの掲示されたコードを参考にして作成しました、

文字列→ファイル作成→解析→ファイル削除という流れのスクリプトより、

3~10倍近く実行時間が短くなりました。

ご回答いただいた皆様、ありがとうございました。

2007/01/09 11:39:56

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません