形態素解析を行うにあたっていくつかの形態素解析エンジンを比較していった結果、
MeCab(http://mecab.sourceforge.jp/)を使用することに致しました。
コマンドライン上で動かすことはできるのですが、
PHPからMeCabを使用するサンプルが見つからないため、
どのようにしたらMeCabの結果をPHPで取得できるかわかりません。
参考になるコードを教えていただけないでしょうか。
テストしている環境はWindows2000, Apache 1.x, PHP 4.x, MeCab 0.9.3となっております。
よろしくお願いいたします。
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の出力が格納されているかと思います。
ご回答ありがとうございます。
ご掲示いただいたWebサイトは既に拝見しておりましたが、
Windows環境ではどのようにしたら活用できるのかわかりませんでした。
また、Visual StudioはC# 2005 Express Editionしか持っておりませんので、
Visual Studio 6の指定となると、申し訳ありませんが使うことができません。。。
ちょっと試してみました。
$mecabpath = 'C:\Progra~1\MeCab\bin\mecab.exe' ; // mecab のパス $inputfile = '"C:\test\test.txt"' ; // input ファイル exec("$mecabpath $inputfile", $result) ;
これで $result に結果が保存されていると思います。
ご回答ありがとうございます。
ご掲示していただいたコードを参考にさせていただいたところ、
とりあえず動作するものを作成することができました。
そこでさらに質問なのですが、
入力をファイルで行うのではなく、文字列を用いることによって実現することはできないでしょうか?
データベース(MySQL)に文章が既に用意されているのですが、
解析の度にファイルを作成→解析では、スマートではないように思えます。
また、文字コードがコマンドラインを経由するためか、
Shift-JISでないと文字化けが起こり正しく結果が出ません。
これまでのスクリプトは、全てEUC-JPで作成してきたので、
できればEUC-JPのみを使用して作成したいのですが可能でしょうか?
よろしくお願いいたします。
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の出力が格納されているかと思います。
ご回答ありがとうございます。
popenのような関数を使うことは検討がついていたのですが、
マニュアルを拝見しても理解できずに頓挫していました。。。
おかげさまで、回答2:GEN111さんの掲示されたコードを参考にして作成しました、
文字列→ファイル作成→解析→ファイル削除という流れのスクリプトより、
3~10倍近く実行時間が短くなりました。
ご回答いただいた皆様、ありがとうございました。
ご回答ありがとうございます。
popenのような関数を使うことは検討がついていたのですが、
マニュアルを拝見しても理解できずに頓挫していました。。。
おかげさまで、回答2:GEN111さんの掲示されたコードを参考にして作成しました、
文字列→ファイル作成→解析→ファイル削除という流れのスクリプトより、
3~10倍近く実行時間が短くなりました。
ご回答いただいた皆様、ありがとうございました。