PHP中计算字符串相似度的函数代码

下面是 PHP 中计算字符串相似度的函数代码的完整攻略。

下面是 PHP 中计算字符串相似度的函数代码的完整攻略。

1. 了解字符串相似度计算方法

常用的字符串相似度计算方法有:莱文斯坦距离、Jaccard系数、余弦相似度等。

  • 莱文斯坦距离:指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。允许的编辑操作包括插入、删除、替换。
  • Jaccard系数:指两个集合的交集大小除以它们的并集大小。它衡量的是两个集合之间的相似性,取值范围在0到1之间。
  • 余弦相似度:是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异程度的大小。

以上这几种方法在实际中均有广泛的应用,不同的场景建议选用不同的算法计算相似度。

2. 编写字符串相似度计算函数

下面以莱文斯坦距离为例,写出计算函数代码:

function levenshtein_distance(string $a, string $b): int {
    $len_a = mb_strlen($a);
    $len_b = mb_strlen($b);
    $d = array();
    for ($i = 0; $i <= $len_a; $i++) {
        $d[$i][0] = $i;
    }
    for ($j = 0; $j <= $len_b; $j++) {
        $d[0][$j] = $j;
    }
    for ($i = 1; $i <= $len_a; $i++) {
        for ($j = 1; $j <= $len_b; $j++) {
            $cost = (mb_substr($a, $i - 1, 1) !== mb_substr($b, $j - 1, 1));
            $d[$i][$j] = min(
                $d[$i - 1][$j] + 1,
                $d[$i][$j - 1] + 1,
                $d[$i - 1][$j - 1] + $cost
            );
        }
    }
    return $d[$len_a][$len_b];
}

莱文斯坦距离的计算原理不再赘述,这里直接解释一下上述代码的实现:

  • $a$b 分别表示需要比较的两个字符串。
  • 首先获取 $a$b 的长度,用于后面的循环操作。
  • 声明一个二维数组 $d,并初始化第一行和第一列为 $i$j 的值。
  • 接下来用两重循环遍历 $a$b 中的每个字符,计算莱文斯坦距离并存储在 $d 中。
  • 最后返回 $d 数组中的最后一个元素就是两个字符串的莱文斯坦距离。

3. 调用计算函数并获取结果

使用该函数计算出两个字符串的距离后,可以将距离值进行归一化,转换为相似度值,例如:

$similarity = 1 - levenshtein_distance('string1', 'sting2') / max(strlen('string1'), strlen('string2'));
echo $similarity;

上述代码中,我们使用 levenshtein_distance() 函数获取字符串 “string1” 和 “string2” 之间的距离,并将其归一化得到相似度值,最后将值存储在 $similarity 变量中,并输出结果。

4. 示例说明

下面举两个例子说明如何使用该函数计算字符串相似度。

示例 1

假设有两个字符串分别为 str1 = 'Hello, World!'str2 = 'Halo,world!',需要计算这两个字符串的相似度,可以采用以下方式:

$similarity = 1 - levenshtein_distance($str1, $str2) / max(strlen($str1), strlen($str2));
echo $similarity;  // 输出:"0.60975609756098"

上述代码中,我们调用 levenshtein_distance() 函数获取字符串 str1str2 之间的距离,并将其归一化得到相似度值为 0.60975609756098

示例 2

假设有两个字符串分别为 str1 = 'I have a dream.'str2 = 'You have a dream too.',需要计算这两个字符串的相似度,可以采用以下方式:

$similarity = 1 - levenshtein_distance($str1, $str2) / max(strlen($str1), strlen($str2));
echo $similarity;  // 输出:"0.52941176470588"

上述代码中,我们调用 levenshtein_distance() 函数获取字符串 str1str2 之间的距离,并将其归一化得到相似度值为 0.52941176470588

以上就是 PHP 中计算字符串相似度的函数代码的完整攻略。

本文标题为:PHP中计算字符串相似度的函数代码

基础教程推荐