0

私が取り組んでいる基本的な検索スクリプトがあります。ユーザーが複数のキーワードを入力できるようにしたい。これらのキーワードのいずれかのつづりが間違っている場合、検索結果のその単語を変更したり、「もしかして...」というメッセージを表示したりしたいと考えています。

私はレーベンシュタインを試しましたが、それは単一の単語でしか機能しないようで、とにかくあまり信頼できないようです. この関数をテストで使用すると、次のようになりました。

<?php
$input = 'ornage ptoato';

$possible_words = explode(' ', trim(strtolower($input)));

foreach($possible_words as $value){

   $words  = array('sony','red', 'indigo','orange','bell','toshiba','potato');

   $shortest = -1;

   foreach ($words as $word) {

       $lev = levenshtein($value, $word);

       if ($lev == 0) {

           $closest = $word;
           $shortest = 0;

           break;
       }

       if ($lev <= $shortest || $shortest < 0) {
           // set the closest match, and shortest distance
           $closest  = $word;
           $shortest = $lev;
       }
   }

}
echo "Input word: $input<br>";
if ($shortest == 0) {
    echo "Exact match found: $closest";
} else {
    echo "Did you mean: $closest?\n";
}

?>

検索文字列内の各単語に対して実行しようとしていたため、foreach 内に foreach があります。

基本的には、Google の「もしかして..」や eBay の「one two theer で 0 件の結果が見つかったので、one two three を検索しました」のように動作するようにしたいと考えています。

4

1 に答える 1

1

コードを少し調整する必要がありました。

<?php
$input = 'ornage ptoato toshiba butts';
$possible_words = explode(' ', trim(strtolower($input)));
$words = array('sony','red', 'indigo','orange','bell','toshiba','potato');
$threshold = 4;

foreach($possible_words as $value){
    $shortest = -1;
    if( in_array($value, $words) ) {
        printf("Exact match for word: %s\n", $value);
    } else {
        foreach ($words as $word) {
             $lev = levenshtein($value, $word);

             if ($lev <= $shortest || $shortest < 0) {
                  // set the closest match, and shortest distance
                  $closest  = $word;
                  $shortest = $lev;
             }
        }
        if($shortest < $threshold) {
            printf("You typed: %s.\nAssuming you meant: %s\n", $value, $closest);
        } else {
            printf("Could not find acceptable match for: %s\n", $value);
        }
    }
}
  1. 許容可能な一致のチェックは、外側のループ内に入る必要がありました。
  2. in_array()レーベンシュタイン距離を計算する前に、完全一致を検索するために使用できます
  3. おそらく、妥当な範囲内の単語のみを一致させたいと思うでしょう。【ヘンチ$threshold

出力:

You typed: ornage.
Assuming you meant: orange
You typed: ptoato.
Assuming you meant: potato
Exact match for word: toshiba
Could not find acceptable match for: butts
于 2012-11-15T00:00:55.193 に答える