2012-08-28 48 views
2

任何人都可以给我一个更好的方法(或者最优选的方法)来找到两个字符串之间的匹配百分比(即这两个字符串(例如名称)与百分比之间的相关程度如何)使用模糊逻辑。任何人都可以帮我编写代码吗?我真的想知道从哪里开始..在php中查找两个字符串之间的匹配百分比?

+7

使用一些模糊逻辑?当然,这里有一个:'$ matchPercentage =($ str1 == $ str2)? 100:0;'。说真的,你能详细说明一下吗? – netcoder

+10

通过“更好”,我假设你已经看到了PHP自己的[similar_text()](http://www.php.net/similar_text)和[levenshtein()](http://www.php.net/levenshtein )? – user113215

+0

我不知道..我只需要一个更好的方法来找到两个名称字符串之间的百分比匹配(我的意思是几乎所有的比较)..虽然我GOOGLE了它,我不能断定哪个选择? sry ..如果我不清楚.. @netcoder – user1518659

回答

4

我只是写基于,不是字符的字符串比较函数 - 这里是,万一有人需要它:

function wordsof($s) { 
    $a = [];foreach(explode(" ",$s)as $w) $a[$w]++; 
    return $a; 
} 

function compare($s1,$s2) { 

    $w1 = wordsof($s1);if(!$w1) return 0; 
    $w2 = wordsof($s2);if(!$w2) return 0; 

    $totalLength = strlen(join("",$w1).join("",$w2)) || 1; 

    $chDiff = 0; 
    foreach($w1 as $word=>$x) if(!$w2[$word]) $chDiff+=strlen($word); 
    foreach($w2 as $word=>$x) if(!$w1[$word]) $chDiff+=strlen($word); 

    return $chDiff/$totalLength; 

} 

逻辑很简单:它在另一个方向上查找一个字符串的每个字。长词重量更多。它提供了一个介于0和1之间的浮点值。您可能希望在比较之前对字符串进行规范化 - 空格修剪,多个空格替换为一个,全部小写等等。此外,它不是很快,但由于单词查找的东西...

如果你不想污染全局命名空间,你可以在比较器中实现“wordsof”。它为了可读性而分开。代码也有所简化,所以在使用它之前先进行测试,但它应该完成这项工作。当我们说话时,我正在使用原始版本。

相关问题