php默认有个函数similar_text()用于计算字符串之间的相似度,该函数也可以计算两个字符串的相似度(以百分比计)。不过这个函数感觉对中文计算很不准确比如:
1
echo
similar_text(
`"吉林禽业公司火灾已致112人遇难",
"吉林宝源丰禽业公司火灾已致112人遇难"`);
这两个新闻标题其实都是一样的,如果使用similar_text()相似对结果为:42,即只相似42%,所以这个感觉很不靠谱,今天刚好收集到一段PHP代码也是用于比较两个字符串的相似度,直接贴出代码:
01
<?php
02
class
LCS {
03
var
$str1
`;`
04
var
$str2
`;`
05
var
$c
=
array
`();`
06
/*
07
返回串一和串二的最长公共子序列
08
*/
09
function
getLCS(
`$str1,` `$str2
,
$len1
= 0,
$len2
= 0) {`
10
$this
`->str1 =
$str1`;
11
$this
`->str2 =
$str2`;
12
if
(
`$len1
== 0)
$len1
=
strlen(
$str1`);
13
if
(
`$len2
== 0)
$len2
=
strlen(
$str2`);
14
$this
`->initC($len1
,
$len2`);
15
return
$this
`->printLCS($this
->c,
$len1
- 1,
$len2
- 1);`
16
}
17
/*
18
返回两个串的相似度
19
*/
20
function
getSimilar(
`$str1,` `$str2
) {`
21
$len1
=
strlen
`($str1
);`
22
$len2
=
strlen
`($str2
);`
23
$len
=
strlen
`($this
->getLCS($str1
,
$str2,` `$len1
,
$len2`));
24
return
$len
* 2 / (
`$len1
+
$len2`);
25
}
26
function
initC(
`$len1,` `$len2
) {`
27
for
(
`$i
= 0;
$i
<
$len1;` `$i
++)
$this->c[
$i`][0] = 0;
28
for
(
`$j
= 0;
$j
<
$len2;` `$j
++)
$this->c[0][
$j`] = 0;
29
for
(
`$i
= 1;
$i
<
$len1;` `$i
++) {`
30
for
(
`$j
= 1;
$j
<
$len2;` `$j
++) {`
31
if
(
`$this->str1[
$i] ==` `$this
->str2[$j
]) {`
32
$this
`->c$i
=
$this->c[
$i
- 1][`$j
- 1] + 1;
33
}
else
if
(
`$this->c[
$i
- 1][$j
] >=
$this->c[
$i][
$j
- 1]) {`
34
$this
`->c$i
=
$this->c[
$i
- 1][$j
];`
35
}
else
{
36
$this
`->c$i
=
$this->c[
$i][
$j
- 1];`
37
}
38
}
39
}
40
}
41
function
printLCS(
`$c,` `$i
,
$j`) {
42
if
(
`$i
== 0 ||
$j
== 0) {`
43
if
(
`$this->str1[
$i] ==` `$this
->str2[$j
])
return
$this->str2[
$j`];
44
else
return
""
`;`
45
}
46
if
(
`$this->str1[
$i] ==` `$this
->str2[$j
]) {`
47
return
$this
`->printLCS($this
->c,
$i
- 1,
$j
- 1).$this
->str2[$j
];`
48
}
else
if
(
`$this->c[
$i
- 1][$j
] >=
$this->c[
$i][
$j
- 1]) {`
49
return
$this
`->printLCS($this
->c,
$i
- 1,
$j`);
50
}
else
{
51
return
$this
`->printLCS($this
->c,
$i`,
$j
- 1);
52
}
53
}
54
}
55
56
$lcs
=
new
LCS();
57
//返回最长公共子序列
58
$lcs
`->getLCS("hello word"
,"hello china"
);`
59
//返回相似度
60
echo
$lcs
`->getSimilar("吉林禽业公司火灾已致112人遇难"
,"吉林宝源丰禽业公司火灾已致112人遇难"
);`
//========================以上是转载==============
具体原理如下,没有细致研究
基于文本比较算法——线性空间求最长公共子序列的Nakatsu算法
http://www.cnblogs.com/grenet/archive/2011/03/11/1964417.html
使用similar_text() 可以看这里《php计算title标题相似比》
end..
代码如下:
<?php class LCS {
var $str1;
var $str2;
var $c = array();
/*
返回串一和串二的最长公共子序列 */ 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);
} /*
返回两个串的相似度 */ function getSimilar($str1, $str2) {
$len1 = strlen($str1);
$len2 = strlen($str2);
$len = strlen($this->getLCS($str1, $str2, $len1, $len2));
return $len \* 2 / ($len1 + $len2);
} 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];
} } } } 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);
} } } $lcs = new LCS(); //返回最长公共子序列 //echo $lcs->getLCS("hello word","hello china"); //echo "<br/>"; //返回相似度 echo $lcs->getSimilar("吉林宝源丰禽业公司","吉林宝源丰禽业公司");
Original url: Access
Created at: 2019-04-12 18:50:41
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
个人博客-leapMie CSDN博客 - 舍其小伙伴 稀土掘金 Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 流星007
最新评论