字符串相似性的算法(优于Levenshtein和similar_text)?Php,Js

Cam*_*ata 12 php

我在哪里可以找到比levenshtein()和php similar_text()方法更准确地评估错位字符拼写的算法?

例:

similar_text('jonas', 'xxjon', $similar); echo $similar; // returns 60
similar_text('jonas', 'asjon', $similar); echo $similar; // returns 60 <- although more similar!
echo levenshtein('jonas', 'xxjon'); // returns 4
echo levenshtein('jonas', 'asjon'); // returns 4  <- although more similar!
Run Code Online (Sandbox Code Playgroud)

/乔纳斯

Cam*_*ata 13

这是我提出的解决方案.这是基于蒂姆关于比较后续字符顺序的建议.一些结果:

  • 乔纳斯/乔纳克斯:0.8
  • jonas/sjona:0.68
  • jonas/sjonas:0.66
  • jonas/asjon:0.52
  • jonas/xxjon:0.36

我确信我并不完美,并且它可以被优化,但是它似乎产生我正在追求的结果......一个弱点是当字符串具有不同的长度时,它产生不同的结果,当值被交换...

static public 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;     
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ker 6

除了 levenshtein() 和 similar_text() 之外,还有:

soundex():返回一个单词的四字符 soundex 键,它应该与任何发音相似的单词的键相同。
metaphone():类似于 soundex,可能对您更有效。它比 soundex() 更准确,因为它知道英语发音的基本规则。变音素生成的键是可变长度的。


Sol*_*try 5

请注意使用string_compare:

ivanov ivan/ivanov ivan:1 好的!

伊万诺夫伊万2 /伊万诺夫伊万:1 o_O

ivanov i van/ivanov i:1.1363636363636天啊!