Jump to content

Finding the Closest Match


dyluck

Recommended Posts

Hi There,

 

Trying to figure out the best function to display the closest match to a string.  I have tried similar_text() and levenshtein()

 

I wrote this myself and it doesn't seem to work well.

function checksimilar( $word, $wordlist ) {

foreach($wordlist as $value) {	
similar_text($word, $value, $percent);	
if($percent > .75) { $newstring[$value] = $percent; }
else { $thekey = "No Close Suggestions"; $newstring[$thekey] = 1; }
}

asort($newstring);
$key = key($newstring);

return $key;

}

 

Tried this too, doesn't work very good either:

 

function checksimilar( $word, $wordlist ) {
$input = $word;

// array of words to check against
$words  = $wordlist;

// no shortest distance found, yet
$shortest = -1;

// loop through words to find the closest
foreach ($words as $word) {

    // calculate the distance between the input word,
    // and the current word
    $lev = levenshtein($input, $word);

    // check for an exact match
    if ($lev == 0) {

        // closest word is this one (exact match)
        $closest = $word;
        $shortest = 0;

        // break out of the loop; we've found an exact match
        break;
    }

    // if this distance is less than the next found shortest
    // distance, OR if a next shortest word has not yet been found
    if ($lev <= $shortest || $shortest < 0) {
        // set the closest match, and shortest distance
        $closest  = $word;
        $shortest = $lev;
    }
}

echo "Input word: $input\n";
if ($shortest <> 0) {
    return $closest;

} //end checksimilar

 

Here is example of what the comparrision is comparing:

 

$word = GameFly_Online_Video_Game_Rentals-Rental_Product_Catalog.txt.gz

 

$wordlist = array(GameSharkStore-Product_Catalog.txt.gz, GameFly_Online_Video_Games_Rentals-Rental_Product_Catalog2.txt.gz, Geeks_com-Product_Catalog_.txt.gz);

 

I of course want it to suggest: GameFly_Online_Video_Games_Rentals-Rental_Product_Catalog2.txt.gz

its slightly different then the original word but very close.

 

Hope someone else has a better way of doing this!

 

 

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.