gpt4 book ai didi

php - 字符串相似性算法(比 Levenshtein 和 similar_text 更好)? PHP, JS

转载 作者:可可西里 更新时间:2023-10-31 22:08:59 25 4
gpt4 key购买 nike

我在哪里可以找到比 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!

/乔纳斯

最佳答案

这是我想出的解决方案。它基于 Tim 的比较后续字符顺序的建议。一些结果:

  • 乔纳斯/乔纳克斯:0.8
  • 乔纳斯/舍纳:0.68
  • 乔纳斯/乔纳斯:0.66
  • 乔纳斯/阿斯琼:0.52
  • 乔纳斯/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;
}

关于php - 字符串相似性算法(比 Levenshtein 和 similar_text 更好)? PHP, JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5351659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com