複数のキーワードが、ある文字列の中にそれぞれ何回含まれているかを調べる早い方法を教えてください。

下記のようなコードを書いたのですが、もっと綺麗、もっと早いと言った方法を教えてください。

文字列は100〜300kb程度、キーワードは数万件です。

また、PostgreSQLやMySQLを使う場合の綺麗で早い書き方もよろしければ教えてください。

(文字部分は例としてxxxxxとしております。)


$text = "xxxxxxxxxxxxxxxxxxxxxxxxxxx.....";
$keywords = array('xxxxx','xxxxx','xxxxx','xxxxx','xxxxx');
foreach($keywords as $keyword){
print "$keyword : " . substr_count($keyword,$text) . "¥n";
}


よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2007/02/10 18:59:01
  • 終了:2007/02/17 19:00:04

回答(2件)

id:bonlife No.1

回答回数421ベストアンサー獲得回数752007/02/10 23:35:40

ポイント35pt

書き方に特に問題はなく、PHPのみで速度を向上させることは難しいと思います。

本当にやりたいことがよく分からなかったので、以下の回答が的外れでしたらすみません。

(キーワードが数万件ありますと、おそらくほとんどのキーワードのカウントが0になりますよね。)

文章の解析を行いたいのでしたら、MeCabを使ってみてはいかがでしょうか。

php_mecabというPHP用のバインディングもあります。

MeCabの解析結果を元に処理を組み立てれば良いような気がします。

id:worldtravel

ありがとうございます。

ズバリMeCabの辞書に記載されているワードです。

ほとんどがカウント0になります。

が、供与レンタルサーバーでMeCabのインストールができません。

ですので辞書だけを使って何とかしたいなと考えていました。

となると無理矢理やるなら数十秒掛かってしまうんですかね...

残念です。

他に何か良い方法などありましたらアドバイス頂ければ幸いです。

2007/02/11 11:08:37
id:bonlife No.2

回答回数421ベストアンサー獲得回数752007/02/11 11:58:56

ポイント35pt

回答ではないのですが、コメント欄が使えないため、こちらで失礼いたします。

そもそもMeCabの良いところは形態素解析できるところです。

substr_countを使ったやり方ではこれは出来ません(無条件に一致する文字列をカウント)が、それは問題ないのでしょうか。

辞書だけ使っても意味のある結果は出せないと思います。

凝ったことをやりたいのであれば、共用レンタルサーバからもう少し自由な環境(専用サーバ、VPS、自宅サーバ)などに移った方が良いと思います。

以下、思いついた方法を書いておきます。

  1. 上記のやり方で夜間などアクセスが少ない時間帯に解析を行い、結果を静的なHTMLで保存しておく
  2. ローカルPCなどの環境で解析した結果をアップロード

少しでも参考になれば幸いです。

id:worldtravel

ありがとうございます。

仰る「形態素解析」もやりたいのですが

やはりもう少し高いサーバーを借りないと難しいようですね。

ありがとうございました。

2007/02/11 14:21:42

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

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません