php - 如何可靠地找到与输入的相似字符串

标签 php mysql string compare

我有一个界面,用户可以在其中输入公司名称。然后,它将他们输入的内容与数据库中的当前条目进行比较,如果发现类似的内容,它会向他们提供选项(以防拼写错误),或者他们可以单击一个按钮,确认他们输入的内容绝对是新的和独特的。

我遇到的问题是它不是很准确,并且经常会出现几十个“相似”的匹配项,但它们根本不那么相似!

这是我现在拥有的,第一个我没有制作的大型函数,我不清楚它到底是做什么的。有没有更简单的方法来实现我想要的?

// Compares strings and determines how similar they are based on a nth letter split     comparison.
function cmp_by_optionNumber($b, $a) {
if ($a["score"] == $b["score"]) return 0;
if ($a["score"] > $b["score"]) return 1;
return -1;
}
function string_compare($str_a, $str_b)
{
$length = strlen($str_a);
$length_b = strlen($str_b);

$i = 0;
$segmentcount = 0;
$segmentsinfo = array();
$segment = '';
while ($i < $length)
{
    $char = substr($str_a, $i, 1);
    if (strpos($str_b, $char) !== FALSE)
    {
        $segment = $segment.$char;
        if (strpos($str_b, $segment) !== FALSE)
        {
            $segmentpos_a = $i - strlen($segment) + 1;
            $segmentpos_b = strpos($str_b, $segment);
            $positiondiff = abs($segmentpos_a - $segmentpos_b);
            $posfactor = ($length - $positiondiff) / $length_b; // <-- ?
            $lengthfactor = strlen($segment)/$length;
           $segmentsinfo[$segmentcount] = array( 'segment' => $segment, 'score' => ($posfactor * $lengthfactor));
        }
        else
        {
             $segment = '';
             $i--;
             $segmentcount++;
         }
     }
     else
     {
         $segment = '';
        $segmentcount++;
     }
     $i++;
 }

 // PHP 5.3 lambda in array_map
 $totalscore = array_sum(array_map(function($v) { return $v['score'];  },    $segmentsinfo));
 return $totalscore;
}

$q = $_POST['stringA'] ;
$qLengthMin = strlen($q) - 5 ; // Part of search calibration. Smaller number = stricter.
$qLengthMax = strlen($q) + 2 ; // not in use.

$main = array() ;

include("pdoconnect.php") ;

$result = $dbh->query("SELECT id, name FROM entity_details WHERE
                  name LIKE '{$q[0]}%'
                  AND CHAR_LENGTH(name) >= '$qLengthMin'
                  #LIMIT 50") ; // The first letter MUST be correct.     This assumption makes checker faster and reduces irrelivant results.
$x = 0 ;
while($row = $result->fetch(PDO::FETCH_ASSOC)) {

$percent = string_compare(strtolower($q), strtolower(rawurldecode($row['name']))) ;

if($percent == 1) {
    //echo 1 ;// 1 signifies an exact match on a company already in our DB.
    echo $row['id'] ;
    exit() ;
}
elseif($percent >= 0.6) { // Part of search calibration. Higher deci number = stricter.
    $x++ ;
    $main[$x]['name'] = rawurldecode($row['name']) ;
    $main[$x]['score'] = round($percent, 2) * 100;

    //array_push($overs, urldecode($row['name']) . " ($percent)<br />") ;
}

}

usort($main, "cmp_by_optionNumber") ;
$z = 0 ;
echo '<div style="overflow-y:scroll;height:175px;width:460px;">' ;
foreach($main as $c) {
if($c['score'] > 100) $c['score'] = 100 ;
if(count($main) > 1) {
echo '<div id="anysuggested' . $z . '" class="hoverdiv" onclick="selectAuto(' . "'score$z'" . ');">' ;
}
else echo '<div id="anysuggested' . $z . '" class="hoverdiv" style="color:#009444;" onclick="selectAuto(' . "'score$z'" . ');">' ;
echo '<span id="autoscore' . $z . '">' . $c['name'] . '</span></div>' ;
$z++ ;
}
echo '</div>' ;

最佳答案

比较字符串是一个很大的话题,有很多方法可以实现。一种非常常见的算法称为 Levenshtein difference 。这是native implementation in PHP但 MySQL 中没有。然而有一个implementation here您可以使用。

关于php - 如何可靠地找到与输入的相似字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10160837/

相关文章:

Nginx + PHP FPM : PATH_INFO always empty

php - 使用 codeigniter 更新表列

python - 使用python在pdf文件中查找字符串

php - laravel 中的数据库表有问题

php - 在 PHP 中执行 Curl 以进行 Stripe 订阅

php - 从mysql数据库创建菜单结构

mysql - 过滤当前日期的记录

Java:如何从字符串和整数计算答案

c# - C#中如何去除字符串中的斜线

PHP 框架与内容管理系统