ようこそゲスト さん ユーザー登録 ログイン

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

  • federal あなたも質問に答えられます! ウォッチリストに追加
  • 状態:終了 いるか
  • 回答数:3 / 45件
  • 回答ポイント:450ポイント
  • 登録:2007-01-07 13:54:58
  • 終了:2007-01-09 11:41:33
  • カテゴリー:ウェブ制作ウェブ制作

3 回答者:bayan 2007-01-09 03:26:58 満足! 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の出力が格納されているかと思います。

質問者:federal 2007-01-09 11:39:56

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

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

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

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

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

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

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

1 回答者:takagimasahiro 2007-01-07 15:12:09 満足! 50ポイント

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

質問者:federal 2007-01-07 19:21:17

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

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

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

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

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

2 回答者:GEN111 2007-01-07 16:08:03 満足! 150ポイント

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

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

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

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

質問者:federal 2007-01-07 19:58:03

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

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

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

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

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

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

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

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

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

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

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

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

おとなり質問

この質問・回答へのトラックバックこの質問・回答へのトラックバック

links for 2007-01-17links for 2007-01-17 Project MultiBurst 2007-01-18 04:24:35
Google AdSenseの収益を50%引き上げるブラックリスト「AdsBlackList.com」 - GIGAZINE (tags: Goo...
mecab + PHP で形態素解析(出現頻度) mecab + PHP で形態素解析をやってみたときのメモです。Yahoo!さんの日本語形態素解析API や mecab PHP 用の拡張モジュールもありますが、windows vista PC にイン