我想比较两个字符串并返回一个比较级别。
字符串1是输入,可以来自客户端的各种格式。例如:
string 1 - "GCSE English Lang Year 10" or
string 1 - "Year 10 Eng Lang GCSE" etc
字符串2是我想要与之比较的字符串。例如:
string 2 - "English Language"
我意识到我可以使用preg_match
来寻找确切的模式:
$subject = $inputString;
$pattern= "/Eng/";
if (preg_match($pattern, $inputString))
{
echo "match";
}
但是有一种方法可以返回一个匹配因子,而不仅仅是是或否?我意识到使用preg_match
类型方法可能会有更复杂的编码答案,但我想知道是否还有一些我找不到的东西。
答案 0 :(得分:2)
您可以使用levenshtein()
功能:
Levenshtein距离定义为您必须替换,插入或删除以将str1转换为str2的最小字符数。算法的复杂度为O(m * n),其中n和m是str1和str2的长度(与similar_text()相比较好,即O(max(n,m)** 3),但是仍然很贵)。
例如Levenshtein距离"英语"和" GCSE英语郎10年级"是12。
$lev = levenshtein('GCSE English Lang Year 10', 'English Language');
echo $lev; // 12
答案 1 :(得分:0)
您拥有自己需要的大部分内容。你需要捕捉你找到的匹配,然后你可以使用levenshtein来看看它与完整单词的不同之处。
$subject = $inputString;
$pattern= "/Eng[a-zA-Z]+/"; // I made it clear that I want all letters in the word.
$matches = array(); // This is an array of all the words that match.
if (preg_match($pattern, $inputString, $matches))
{
$match = $matches[0]; // Check first match - assume only one matched.
$diff = levenshtein(strtolower($match), 'english');
print "Found $match which is $diff edits from English.\n";
}
现在,最大$ diff将是:max(strlen($match), strlen('english'));
。如果您将$ max设置为最大差异,则0到100之间的相似度为100*($max-$diff)/$max;
- 但我建议您不要这样做。这是一个糟糕的指标。坚持使用$ diff并寻找最低的$ diff。
答案 2 :(得分:0)
也许是这样的:
$string1 = "GCSE English Lang Year 10";
$string2 = "Year 10 Eng Lang GCSE";
$i = array_intersect(
str_word_count(strtolower($string1), 2),
str_word_count(strtolower($string2), 2)
);
$similarityPercentage = count($i) / max(count($array1), count($array2)) * 100;
计算两个字符串中相同单词的百分比,但不允许将English
缩写为Eng