人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: federal
●カテゴリ:ウェブ制作
✍キーワード:Apache MeCab PHP Windows2000 エンジン
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● m-takagi
●50ポイント

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

◎質問者からの返答

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

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

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

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

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


2 ● GEN111
●150ポイント

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

$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のみを使用して作成したいのですが可能でしょうか?

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


3 ● bayan
●250ポイント ベストアンサー

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倍近く実行時間が短くなりました。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ