PHP中是否有方法可比较两个非完全相等字符串的相似度?
PHP字符串相似度量化比对实现方案
PHP原生已内置相关函数可直接实现字符串相似度的量化计算,无需引入第三方依赖,常用实现方案如下:
核心原生函数说明
similar_text():直接计算两个字符串的匹配相似度,支持直接返回百分比数值,算法时间复杂度为O(n³),适合短字符串场景。levenshtein():计算两个字符串的编辑距离(即需要多少次增/删/改操作才能将字符串1转为字符串2,数值越小相似度越高),算法时间复杂度为O(m*n),性能优于similar_text(),默认支持最长255字符的字符串比对。
需求实现示例
你需要的str_compare_similarities函数可以基于上述原生函数封装实现,示例代码如下:
<?php /** * 比对两个字符串的相似度 * @param string $a 字符串1 * @param string $b 字符串2 * @param int $algo 比对算法:1=similar_text 2=levenshtein * @return float 0~1之间的相似度数值,1为完全匹配 */ function str_compare_similarities(string $a, string $b, int $algo = 1): float { // 空字符串边界处理 if ($a === $b) return 1.0; if (empty($a) || empty($b)) return 0.0; if ($algo === 1) { similar_text($a, $b, $percent); return round($percent / 100, 3); } $editDistance = levenshtein($a, $b); $maxLength = max(mb_strlen($a), mb_strlen($b)); return round(1 - $editDistance / $maxLength, 3); } // 测试用例 $a = "Stack Overflow"; $b = "Stack-Overflow"; $result = str_compare_similarities($a, $b); // 输出结果为0.923,符合预期的近似量化结果 ?>
注意事项
- 原生函数默认按字节计算相似度,如果需要比对中文字符串,建议先将字符串转为UTF-32编码统一字符长度,或引入中文分词库基于分词结果做余弦相似度计算,结果会更准确。
- 长文本相似度比对建议使用levenshtein算法,或基于分词的向量空间模型实现,避免similar_text的性能问题。
内容的提问来源于stack exchange,提问作者Gowire
相关产品推荐
相关产品推荐

