在PHP中使用Levenshtein函数查找最近的单词
该levenshtein()函数是一组函数的一部分,这些函数用于根据字符串的发音levenshtein()来查看字符串的结构,使用可以查看两个字符串之间的总差(定义为距离值)。这样做的重要功能是可以将一个字符串与另一个字符串进行比较,看看它们是否相似。
该levenshtein()函数有两个参数,这是您要相互比较的两个字符串。如果两个字符串相同,则距离为零,此值越高,两个字符串之间的距离就越大。这里有些例子。
echo levenshtein('word','word'); //0 echo levenshtein('stone','magnet'); //4 echo levenshtein('window','windmill'); //4 echo levenshtein('wibble','wobble'); //1 echo levenshtein('test','toast'); //2个 echo levenshtein('I','antidisestablishmentarianism'); //2个8
那么这有实际用途吗?简短的答案是肯定的。您可以使用此功能做的最好的事情之一是创建拼写检查器或Google风格的“您是不是要”以及您的搜索查询。
为此,您必须首先加载可以使用的单词词典。我在互联网上找到了一套不错的单词表,并对此进行了修改以减少单词数。这个新的英语单词列表有6,752个单词,大小约为65KB,这意味着可以以最小的麻烦将其加载到内存中。
通过使用以下代码,可以将该字典加载到内存中。
$dictionary = 'english.txt'; $handle = fopen($dictionary, "r"); while(!feof($handle)){ $words .= fread($handle, 8192); } fclose($handle); $words = explode("\n",$words);
现在,我们有了一系列单词。如果我们要输入一个拼写错误的单词,脚本现在需要使用词典来比较该单词并找到最接近输入单词的单词。
$input=stripslashes(strip_tags($_GET['q']));
首先,我们遍历字典中的每个单词,并将其与当前单词进行比较。
foreach ($words as $word) { $lev = levenshtein($input, $word); }
在循环的每次迭代中,我们都应该遇到两种情况。
输入的单词将在单词数组中找到完全匹配的单词。这是通过零的levenshtein距离发现的。
在levenshtein()当前词将小于其他任何字看着迄今。
为了解决第一种情况,我们只说如果levenshtein值为零,则跳出循环。如果我们知道已经有了所需的内容,那么遍历整个数组的其余部分毫无意义。
通过存储最小距离并使用此距离来查看下一个单词是否更短,来解决第二种情况,依此类推。循环结束后,我们应该有一个与输入的单词非常匹配的单词。最初,我们应将此距离设置为-1,因为该levenshtein()函数将永远不会返回小于零的值。
$distance = -1; foreach($words as $word){ $lev = levenshtein($input, $word); //完全符合 if($lev == 0){ $closest = $word; $distance = 0; //无需继续,因为我们已经找到了完全匹配的内容 break; } //如果距离小于当前存储的距离并且小于我们的初始值 if($lev <= $distance || $distance < 0){ $closest = $word; $distance = $lev; } }
现在,$closest变量包含我们最接近(或完全匹配)的单词,而$distance值显示两个单词之间的距离,该距离可能为零。
现在我们可以打印出结果了。如果我们是为搜索功能创建的,则无需打印出完全匹配的内容,只需打印最接近的匹配词即可。一个简单的if语句来检查距离是否大于零即可解决此问题。
if ($distance > 0) { echo "Did you mean: ".$closest."?"; }
这是运行中的代码的示例页面,为方便起见,我已打印出输入变量。
可以在levenshtein维基百科页面上找到有关levenshtein的更多信息。