-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathsimilar.php
100 lines (93 loc) · 2.48 KB
/
similar.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?php
/**
* 文本相似度匹配,可用于防范垃圾群发
* 特别说明,此方法源自网络别人写好的Class,目前没有搜到是谁第一个写的
* @作者 qinggan <[email protected]>
* @主页 https://www.phpok.com
* @版本 5.x
* @授权 MIT License <https://www.phpok.com/mit.html>
* @时间 2020年1月7日
**/
/**
* 安全限制,防止直接访问
**/
if(!defined("PHPOK_SET")){
exit("<h1>Access Denied</h1>");
}
class similar_lib extends _init_lib
{
var $str1;
var $str2;
var $c = array();
/*
返回串一和串二的最长公共子序列
*/
public function getLCS($str1, $str2, $len1 = 0, $len2 = 0) {
$this->str1 = $str1;
$this->str2 = $str2;
if ($len1 == 0){
$len1 = strlen($str1);
}
if ($len2 == 0){
$len2 = strlen($str2);
}
$this->initC($len1, $len2);
return $this->printLCS($this->c, $len1 - 1, $len2 - 1);
}
/*
* 返回两个串的相似度
*/
public function ssim($str1='', $str2='')
{
if(!$str1 || !$str2){
return false;
}
$str1 = strip_tags($str1);
$str2 = strip_tags($str2);
if(!$str1 || !$str2){
return false;
}
$len1 = strlen($str1);
$len2 = strlen($str2);
$len = strlen($this->getLCS($str1, $str2, $len1, $len2));
return round(($len * 2 / ($len1 + $len2))*100,2);
}
private function initC($len1, $len2)
{
for ($i = 0; $i < $len1; $i++){
$this->c[$i][0] = 0;
}
for ($j = 0; $j < $len2; $j++){
$this->c[0][$j] = 0;
}
for ($i = 1; $i < $len1; $i++) {
for ($j = 1; $j < $len2; $j++) {
if ($this->str1[$i] == $this->str2[$j]) {
$this->c[$i][$j] = $this->c[$i - 1][$j - 1] + 1;
} else if ($this->c[$i - 1][$j] >= $this->c[$i][$j - 1]) {
$this->c[$i][$j] = $this->c[$i - 1][$j];
} else {
$this->c[$i][$j] = $this->c[$i][$j - 1];
}
}
}
}
private function printLCS($c, $i, $j)
{
if ($i == 0 || $j == 0) {
if ($this->str1[$i] == $this->str2[$j]) return $this->str2[$j];
else return "";
}
if ($this->str1[$i] == $this->str2[$j]) {
return $this->printLCS($this->c, $i - 1, $j - 1).$this->str2[$j];
} else if ($this->c[$i - 1][$j] >= $this->c[$i][$j - 1]) {
return $this->printLCS($this->c, $i - 1, $j);
} else {
return $this->printLCS($this->c, $i, $j - 1);
}
}
}
/**
* 在 PHPOK 里调用方法 $this->lib('similar')->ssim('文本一','文本二');
* 返回的值如果一般都是小于100,建议设置高于70为同样的贴子
**/