similar_text — 计算两个字符串的相似度
int similar_text ( string $first , string $second [, float &$percent ] )
$first 必需。规定要比较的第一个字符串。
$second 必需。规定要比较的第二个字符串。
$percent 可选。规定供存储百分比相似度的变量名。
两个字符串的相似程度计算依据 Oliver [1993] 的描述进行。注意该实现没有使用 Oliver 虚拟码中的堆栈,但是却进行了递归调用,这个做法可能会导致整个过程变慢或变快。也请注意,该算法的复杂度是 O(N**3),N 是最长字符串的长度。
比如我们想找字符串abcdefg和字符串aeg的相似度:
$first = "abcdefg"; $second = "aeg"; echo similar_text($first, $second);
结果输出3.如果想以百分比显示,则可使用它的第三个参数,如下:
$first = "abcdefg"; $second = "aeg"; similar_text($first, $second, $percent); echo $percent;
这里的相似度的算法是什么呢?本来是想看看Oliver[1993]对于这个算法的具体描述,各种google后,只找到这是从Ian Oliver1993年出版的书《Programming classics: implementing the world’s best algorithms》中记载,没有找到这本书的电子版。
直接代码,在string.c文件中我们找到了similar_text的实现PHP_FUNCTION(similar_text),其最终调用php_similar_cha获取两个字符串的相似度,如下代码:
static int php_similar_char(const char *txt1, int len1, const char *txt2, int len2) { int sum; int pos1, pos2, max; php_similar_str(txt1, len1, txt2, len2, &pos1, &pos2, &max); if ((sum = max)) { if (pos1 && pos2) { sum += php_similar_char(txt1, pos1, txt2, pos2); } if ((pos1 + max < len1) && (pos2 + max < len2)) { sum += php_similar_char(txt1 + pos1 + max, len1 - pos1 - max,txt2 + pos2 + max, len2 - pos2 - max); } } return sum; }
首先我们看php_similar_str函数的作用,从函数名和参数名我们可以大致猜测它的作用是求两个字符串的相似子串,具体代码如下:
static void php_similar_str(const char *txt1, int len1, const char *txt2, int len2, int *pos1, int *pos2, int *max) { char *p, *q; char *end1 = (char *) txt1 + len1; char *end2 = (char *) txt2 + len2; int l; *max = 0; for (p = (char *) txt1; p < end1; p++) { for (q = (char *) txt2; q < end2; q++) { for (l = 0; (p + l < end1) && (q + l < end2) && (p[l] == q[l]); l++); if (l > *max) { *max = l; *pos1 = p - txt1; *pos2 = q - txt2; } } } }
很直白的三重循环,求两个字符串的最大相似子串的长度,以及这两个子串相等的开始位置。
在了解了php_similar_str的作用后,回到php_similar_char函数。这是一个很直白的二分算法。以当前两个字符串的最大 相似子串的位置为分隔,向两边二分查找相似子串,最终得到所有的相似子串长度的总和,这也就是我们这个函数的相似度算法:从最长子串开始,依次统计所有的 子串长度。
那么这里的百分比是如何计算的呢?
在PHP_FUNCTION(similar_text)的函数体中,如下代码:
sim = php_similar_char(t1, t1_len, t2, t2_len); if (ac > 2) { Z_DVAL_PP(percent) = sim * 200.0 / (t1_len + t2_len); }
sim是相似度的值,百分比是直接 sim * 200 / 两个字符串的长度。
原文参考:http://www.phppan.com/2012/02/php-similar-text/
相关推荐
在PHP中,计算字符串相似度有多种方法,其中最常用的两个函数是`similar_text`和`levenshtein`。这两个函数可以帮助开发者评估两个字符串之间的相似程度,特别是在文本处理、搜索优化或者数据清洗等场景中非常有用。...
在上述给定文件中,描述中提到的“改进计算字符串相似度的函数”指的就是为了解决原生`similar_text()`和`levenshtein()`函数对中文汉字支持不好的问题而编写的自定义函数。这个自定义函数的实现思路是,首先将中文...
- `similar_text()`函数并不总是最精确的方法来计算字符串相似度,特别是在处理多字节字符(如中文字符)时,由于字符编码的原因,结果可能不完全准确。 - `levenshtein()`函数虽然速度较快,但可能不如`similar_...
similar_text 函数计算字符串相似度,以便于文本比较和检索。 29. soundex: 计算字符串的读音值 soundex 函数计算字符串的读音值,以便于文本比较和检索。 30. sprintf: 将字符串格式化 sprintf 函数将字符串...
在编程领域,特别是PHP开发中,字符串相似度查询是一项重要的功能。它可以帮助我们识别和校正用户输入的错误,或者在数据匹配、文本分析等方面发挥作用。本文主要介绍了PHP查询相似度最高的字符串的方法,并通过实例...
php默认有个函数similar_text()用于计算字符串之间的相似度,该函数也可以计算两个字符串的相似度(以百分比计)。不过这个函数感觉对中文计算很不准确
- `str_word_count` 计算字符串中的单词数。 - `stripos`、`stristr`、`strpos` 等函数用于在字符串中查找另一个字符串的位置。 - `strnatcmp` 和 `strnatcasecmp` 使用“自然顺序”算法进行字符串比较。 - `strpbrk...
在PHP编程语言中,有一个非常流行的字符串相似度计算函数叫做levenshtein,它广泛应用于程序中处理自然语言的场景,例如拼写检查、文本比较、数据库模糊查询等方面。 Levenshtein距离,也就是编辑距离,是一种用来...
1. **字符串相似度算法**:该库可能实现了几种常见的字符串相似度计算方法,如Levenshtein距离、Jaccard相似度、Damerau-Levenshtein距离、Jaro-Winkler距离等。这些算法可以量化两个字符串之间的差异程度,帮助我们...
`similar_text` – 字符串相似度计算 - **功能**:计算两个字符串之间的相似度百分比。 - **示例**: ```php similar_text("Hello", "Halo", $percent); echo $percent; // 输出: 60 ``` ##### 36. `soundex`...
28. `soundex()`:计算字符串的Soundex值,用于基于发音的字符串比较。 29. `sprintf()`:类似于`printf()`,但返回的是格式化后的字符串,而不是直接输出。 30. `strchr()`(等同于`strstr()`):找到字符串中第...
- crc32()函数用于计算字符串的CRC32校验码,常用于数据完整性校验。 8. crypt() - crypt()函数提供了一种单向散列加密方式,常用于密码存储。 9. echo 和 print() - echo和print函数用于输出内容,但echo可以...
`soundex()`函数计算字符串的Soundex键,用于快速比较发音相近的单词。`sprintf()`返回格式化后的字符串,而`sscanf()`则从字符串中解析输入,类似于`fscanf()`,但用于字符串而不是文件。 最后,`str_ireplace()`...
- `crc32()`:计算字符串的CRC32校验和,常用于数据完整性检查。 - `crypt()`:使用DES算法对字符串进行加密,是密码存储的良好选择。 - `echo()`:直接输出一个或多个字符串,是PHP中最常用的输出函数之一。 - ...
PHP中的similar_text()函数是一个用于比较两个字符串相似度的函数。它计算两个字符串之间的相似性并返回相似度的百分比。这个函数在处理需要文本相似性分析的场景时非常有用,比如在搜索推荐、拼写检查、文本比较等...
51. `str_word_count()`:计算字符串中的单词数量。 52. `strcasecmp()`:不区分大小写的字符串比较。 53. `strchr()`:在字符串中查找第一次出现的目标子串,与`strstr()`功能相同。 54. `strcmp()`:区分大小写...