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
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 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
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论