PHP中的任何函数都检查两个字符串的相似度百分比吗?如何检查PHP中两个字符串的部分相似度
,比如我有:
$string1="Hello how are you doing"
$string2= " hi, how are you"
和function($string1, $string2)
将返回我真因为词“如何”,“是”,“你”是存在于行。
甚至更好,回报我60%的相似性,因为“如何”,“是”,“你”是$string1
的3/5。
PHP中有哪些函数可以实现呢?
PHP中的任何函数都检查两个字符串的相似度百分比吗?如何检查PHP中两个字符串的部分相似度
,比如我有:
$string1="Hello how are you doing"
$string2= " hi, how are you"
和function($string1, $string2)
将返回我真因为词“如何”,“是”,“你”是存在于行。
甚至更好,回报我60%的相似性,因为“如何”,“是”,“你”是$string1
的3/5。
PHP中有哪些函数可以实现呢?
正如其他答案已经说过,你可以使用similar_text。 这里的演示:
$string1="Hello how are you doing" ;
$string2= " hi, how are you";
echo similar_text($string1, $string2, $perc); //12
echo $perc; //61.538461538462
将返回12,并且将设置在$ PERC相似的百分比,你提出的要求。
@Alex不需要使用PHP_EOL。 – 2013-05-13 11:55:57
我刚刚使用EOL作为回声,所以结果格式很好,并且可读。但是你是对的,它不需要代码。 – 2013-05-13 11:57:16
由于这是一个很好的问题,我把一些精力投入到它:
<?php
$string1="Hello how are you doing";
$string2= " hi, how are you";
echo 'Compare result: ' . compareStrings($string1, $string2) . '%';
//60%
function compareStrings($s1, $s2) {
//one is empty, so no result
if (strlen($s1)==0 || strlen($s2)==0) {
return 0;
}
//replace none alphanumeric charactors
//i left - in case its used to combine words
$s1clean = preg_replace("/[^A-Za-z0-9-]/", ' ', $s1);
$s2clean = preg_replace("/[^A-Za-z0-9-]/", ' ', $s2);
//remove double spaces
while (strpos($s1clean, " ")!==false) {
$s1clean = str_replace(" ", " ", $s1clean);
}
while (strpos($s2clean, " ")!==false) {
$s2clean = str_replace(" ", " ", $s2clean);
}
//create arrays
$ar1 = explode(" ",$s1clean);
$ar2 = explode(" ",$s2clean);
$l1 = count($ar1);
$l2 = count($ar2);
//flip the arrays if needed so ar1 is always largest.
if ($l2>$l1) {
$t = $ar2;
$ar2 = $ar1;
$ar1 = $t;
}
//flip array 2, to make the words the keys
$ar2 = array_flip($ar2);
$maxwords = max($l1, $l2);
$matches = 0;
//find matching words
foreach($ar1 as $word) {
if (array_key_exists($word, $ar2))
$matches++;
}
return ($matches/$maxwords) * 100;
}
?>
最后一个答案没有无用(在本例中)'similar_text'。 +1 – enenen 2013-05-13 11:49:16
哇!感谢您的杰出答案!唯一的问题是我使用不同语言的字符串。如日文,西班牙文,俄文。 还有另一种方法可以使它更有趣和复杂。例如,如果单词以相同的顺序出现,您想给它额外的相似点。像“你好,你好吗”是好的,但“你好,你怎么样”我不太好。 – 2013-05-13 12:27:23
另外,similar_text可以使错误更具说服力。例如,如果我写“他在街上行走”和“他在街上行走”,它仍然可以。 – 2013-05-13 12:33:43
确定这里是我的功能,使得它更有趣。
我在检查字符串的大致相似性。
这是我使用的标准。
实施例:
$string1 = "How much will it cost to me" (string in vocabulary)
$string2 = "How much does costs it " //("costs" instead "cost" -is a mistake) (user input);
算法: 1)检查字的相似性,并创建清洁字符串与“右”的单词(在它出现在词汇中的顺序)。 输出:“花多少钱” 2)用“正确的单词”创建干净的字符串,以便它出现在用户输入中。 输出:“多少成本” 3)比较两个输出 - 如果不相同 - 返回否,否则如果相同返回是。
error_reporting(E_ALL);
ini_set('display_errors', true);
$string1="сколько это стоит ваще" ;
$string2= "сколько будет стоить это будет мне";
if(compareStrings($string1, $string2)) {
echo "yes";
} else {
echo 'no';
}
//echo compareStrings($string1, $string2);
function compareStrings($s1, $s2) {
if (strlen($s1)==0 || strlen($s2)==0) {
return 0;
}
while (strpos($s1, " ")!==false) {
$s1 = str_replace(" ", " ", $s1);
}
while (strpos($s2, " ")!==false) {
$s2 = str_replace(" ", " ", $s2);
}
$ar1 = explode(" ",$s1);
$ar2 = explode(" ",$s2);
// $array1 = array_flip($ar1);
// $array2 = array_flip($ar2);
$l1 = count($ar1);
$l2 = count($ar2);
$meaning="";
$rightorder="";
$compare=0;
for ($i=0;$i<$l1;$i++) {
for ($j=0;$j<$l2;$j++) {
$compare = (similar_text($ar1[$i],$ar2[$j],$percent)) ;
// echo $compare;
if ($percent>=85) {
$meaning=$meaning." ".$ar1[$i];
$rightorder=$rightorder." ".$ar1[$j];
$compare=0;
}
}
}
//print_r($rightorder);
if ($rightorder==$meaning) {
return true;
} else {
return false;
}
}
我很想听听您的意见和建议如何改进它
很久以前,只是读了这个答案。如果输入两个完全不同的字符串,它将返回true,因为$ rightorder和$ meaning都保留一个空字符串。 – 2013-09-16 20:45:34
除了亚历克斯Siri的答案,并按照下面的文章:
http://docstore.mik.ua/orelly/webprog/php/ch04_06.htm
PHP提供了一些功能让您测试两个字符串是否大致相等:
$string1="Hello how are you doing" ;
$string2= " hi, how are you";
SOUNDEX
if (soundex($string1) == soundex($string2)) {
echo "similar";
} else {
echo "not similar";
}
音位
if (metaphone($string1) == metaphone($string2)) {
echo "similar";
} else {
echo "not similar";
}
类似的文本
$similarity = similar_text($string1, $string2);
的Levenshtein
$similarity = levenshtein($string1, $string2);
您可以使用PHP函数similar_text
。
int similar_text (string $first , string $second)
通过了解虽然, “相似” 可能意味着不同的事情。 – 2013-05-13 11:18:02
请定义“相似性”。它与单个字符,单词,还是短语有关?不要认为'similar_text'会完成这项工作。 – enenen 2013-05-13 11:18:44
similar_text函数做类似的事情,但阅读http://stackoverflow.com/questions/14136349/how-does-similar-text-work,看看它是如何工作的。它可能不会达到你的期望。如果你想要匹配单词的百分比,我会建议一个自定义的方法,使用某种形式的爆炸清理字符串。 – 2013-05-13 11:19:34