代码之家  ›  专栏  ›  技术社区  ›  Adam Kiss

php-smart,容错字符串比较

  •  4
  • Adam Kiss  · 技术社区  · 15 年前

    我在寻找常规的方法或者寻找允许错误的字符串比较的方法。

    比如说,我们有测试字符串 Čakánka -是的,它包含CE字符。

    现在,我想接受以下任何字符串作为 OK :

    • 卡坎卡
    • C·K·K·K
    • 阿根卡
    • 卡坎卡
    • 卡尼卡
    • 卡安卡
    • 卡卡纳

    问题是,我经常在Word中切换字母,我想尽量减少用户对无法(即,你很匆忙)正确地写一个单词的失望。

    所以,我知道如何进行CI比较(只需将其设为小写),我可以删除CE字符,我只是无法忍受几个交换字符。

    而且,你经常把一个字符放错地方( character = & gt; cahracter ,但有时会移动多个位置( 性格 = & gt; carahcter 因为一根手指在写字时很懒。

    谢谢:

    3 回复  |  直到 13 年前
        1
  •  4
  •   Pascal MARTIN    15 年前

    不确定 (尤其是关于口音/特殊字符的东西,你可能需要先处理) ,但对于位置错误或丢失的字符, levenshtein 功能 ,计算 Levenshtein distance 在两条线之间,也许能帮到你 (引证) :

    int levenshtein  ( string $str1  , string $str2  )
    int levenshtein  ( string $str1  , string $str2  , int $cost_ins  , int $cost_rep  , int $cost_del  )
    

    Levenshtein距离定义为 您的最小字符数 必须替换、插入或删除到 将str1转换为str2


    其他可能有用的函数可以是 soundex , similar_text metaphone .

    以及这些功能手册页上的一些用户注释,尤其是 manual page of levenshtein 可能也会给你带来一些有用的东西;-)

        2
  •  3
  •   Gumbo    15 年前

    你可以把这些单词译成拉丁字母,然后使用语音算法,比如 Soundex 从你的话语中获得本质,并将其与你所拥有的相比较。如果是你的话 C252 除了最后一句 C250 .


    编辑 ____ levenshtein similar_text 您需要为每对输入值和可能的匹配值调用它们。这意味着如果您有一个包含100万个条目的数据库,您将需要调用这些函数100万次。

    但是功能就像 soundex metaphone 计算某种类型的摘要,可以帮助减少实际比较的数量。如果你储存 桑德克斯 变形金刚 对于数据库中的每个已知单词,可以快速减少可能匹配的数目。稍后,当可能的匹配值集减少时,可以使用比较函数获得最佳匹配。

    这里是一个例子:

    // building the index that represents your database
    $knownWords = array('Čakánka', 'Cakaka');
    $index = array();
    foreach ($knownWords as $key => $word) {
        $code = soundex(iconv('utf-8', 'us-ascii//TRANSLIT', $word));
        if (!isset($index[$code])) {
            $index[$code] = array();
        }
        $index[$code][] = $key;
    }
    
    // test words
    $testWords = array('cakanka', 'cákanká', 'ČaKaNKA', 'CAKANKA', 'CAAKNKA', 'CKAANKA', 'cakakNa');
    echo '<ul>';
    foreach ($testWords as $word) {
        $code = soundex(iconv('utf-8', 'us-ascii//TRANSLIT', $word));
        if (isset($index[$code])) {
            echo '<li> '.$word.' is similar to: ';
            $matches = array();
            foreach ($index[$code] as $key) {
                similar_text(strtolower($word), strtolower($knownWords[$key]), $percentage);
                $matches[$knownWords[$key]] = $percentage;
            }
            arsort($matches);
            echo '<ul>';
            foreach ($matches as $match => $percentage) {
                echo '<li>'.$match.' ('.$percentage.'%)</li>';
            }
            echo '</ul></li>';
        } else {
            echo '<li>no match found for '.$word.'</li>';
        }
    }
    echo '</ul>';
    
        3
  •  1
  •   wallyk    15 年前

    拼写检查的作用类似于 fuzzy string comparison . 也许您可以根据该引用调整算法。或者从开源项目中获取拼写检查器猜测代码,比如 Firefox .

    推荐文章