PHP改进计算字符串相似度的函数similar_text()、levenshtein()


Posted in PHP onOctober 27, 2014

similar_text()中文汉字版

     <?php  

     //拆分字符串  

     function split_str($str) {  

       preg_match_all("/./u", $str, $arr);  

       return $arr[0];  

     }  

       

     //相似度检测  

     function similar_text_cn($str1, $str2) {  

       $arr_1 = array_unique(split_str($str1));  

       $arr_2 = array_unique(split_str($str2));  

       $similarity = count($arr_2) - count(array_diff($arr_2, $arr_1));  

         

       return $similarity;  

     }  

levenshtein()中文汉字版
 

     <?php  

     //拆分字符串  

     function mbStringToArray($string, $encoding = 'UTF-8') {  

         $arrayResult = array();  

         while ($iLen = mb_strlen($string, $encoding)) {  

             array_push($arrayResult, mb_substr($string, 0, 1, $encoding));  

             $string = mb_substr($string, 1, $iLen, $encoding);  

         }  

         return $arrayResult;  

     }  

     //编辑距离  

     function levenshtein_cn($str1, $str2, $costReplace = 1, $encoding = 'UTF-8') {  

         $count_same_letter = 0;  

         $d = array();  

         $mb_len1 = mb_strlen($str1, $encoding);  

         $mb_len2 = mb_strlen($str2, $encoding);  

         $mb_str1 = mbStringToArray($str1, $encoding);  

         $mb_str2 = mbStringToArray($str2, $encoding);  

         for ($i1 = 0; $i1 <= $mb_len1; $i1++) {  

             $d[$i1] = array();  

             $d[$i1][0] = $i1;  

         }  

         for ($i2 = 0; $i2 <= $mb_len2; $i2++) {  

             $d[0][$i2] = $i2;  

         }  

         for ($i1 = 1; $i1 <= $mb_len1; $i1++) {  

             for ($i2 = 1; $i2 <= $mb_len2; $i2++) {  

                 // $cost = ($str1[$i1 - 1] == $str2[$i2 - 1]) ? 0 : 1;  

                 if ($mb_str1[$i1 - 1] === $mb_str2[$i2 - 1]) {  

                     $cost = 0;  

                     $count_same_letter++;  

                 } else {  

                     $cost = $costReplace; //替换  

                 }  

                 $d[$i1][$i2] = min($d[$i1 - 1][$i2] + 1, //插入  

                 $d[$i1][$i2 - 1] + 1, //删除  

                 $d[$i1 - 1][$i2 - 1] + $cost);  

             }  

         }  

         return $d[$mb_len1][$mb_len2];  

         //return array('distance' => $d[$mb_len1][$mb_len2], 'count_same_letter' => $count_same_letter);  

     }  

 
最长公共子序列LCS()

 
         <?php  

         //最长公共子序列英文版  

         function LCS_en($str_1, $str_2) {  

           $len_1 = strlen($str_1);  

           $len_2 = strlen($str_2);  

           $len = $len_1 > $len_2 ? $len_1 : $len_2;  

           $dp = array();  

           for ($i = 0; $i <= $len; $i++) {  

             $dp[$i] = array();  

             $dp[$i][0] = 0;  

             $dp[0][$i] = 0;  

           }  

           for ($i = 1; $i <= $len_1; $i++) {  

             for ($j = 1; $j <= $len_2; $j++) {  

               if ($str_1[$i - 1] == $str_2[$j - 1]) {  

                 $dp[$i][$j] = $dp[$i - 1][$j - 1] + 1;  

               } else {  

                 $dp[$i][$j] = $dp[$i - 1][$j] > $dp[$i][$j - 1] ? $dp[$i - 1][$j] : $dp[$i][$j - 1];  

               }  

             }  

           }  

           return $dp[$len_1][$len_2];  

         }  

         //拆分字符串  

         function mbStringToArray($string, $encoding = 'UTF-8') {  

           $arrayResult = array();  

           while ($iLen = mb_strlen($string, $encoding)) {  

             array_push($arrayResult, mb_substr($string, 0, 1, $encoding));  

             $string = mb_substr($string, 1, $iLen, $encoding);  

           }  

           return $arrayResult;  

         }  

         //最长公共子序列中文版  

         function LCS_cn($str1, $str2, $encoding = 'UTF-8') {  

           $mb_len1 = mb_strlen($str1, $encoding);  

           $mb_len2 = mb_strlen($str2, $encoding);  

           $mb_str1 = mbStringToArray($str1, $encoding);  

           $mb_str2 = mbStringToArray($str2, $encoding);  

           $len = $mb_len1 > $mb_len2 ? $mb_len1 : $mb_len2;  

           $dp = array();  

           for ($i = 0; $i <= $len; $i++) {  

             $dp[$i] = array();  

             $dp[$i][0] = 0;  

             $dp[0][$i] = 0;  

           }  

           for ($i = 1; $i <= $mb_len1; $i++) {  

             for ($j = 1; $j <= $mb_len2; $j++) {  

               if ($mb_str1[$i - 1] == $mb_str2[$j - 1]) {  

                 $dp[$i][$j] = $dp[$i - 1][$j - 1] + 1;  

               } else {  

                 $dp[$i][$j] = $dp[$i - 1][$j] > $dp[$i][$j - 1] ? $dp[$i - 1][$j] : $dp[$i][$j - 1];  

               }  

             }  

           }  

           return $dp[$mb_len1][$mb_len2];  

         }
PHP 相关文章推荐
PHP 文件上传进度条的两种实现方法的代码
Nov 25 PHP
php后台如何避免用户直接进入方法实例
Oct 15 PHP
PHP使用静态方法的几个注意事项
Sep 16 PHP
php简单实现MVC
Feb 05 PHP
基于PHP实现简单的随机抽奖小程序
Jan 05 PHP
轻松掌握php设计模式之访问者模式
Sep 23 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
Jun 20 PHP
PHP中“=&gt;
Mar 01 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
Mar 14 PHP
Thinkphp整合阿里云OSS图片上传实例代码
Apr 28 PHP
php常用字符串查找函数strstr()与strpos()实例分析
Jun 21 PHP
php实现大文件断点续传下载实例代码
Oct 01 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 #PHP
Linux下PHP加速器APC的安装与配置笔记
Oct 24 #PHP
Linux下安装PHP MSSQL扩展教程
Oct 24 #PHP
Windows下的PHP安装pear教程
Oct 24 #PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
Oct 24 #PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
Oct 24 #PHP
PHP中soap的用法实例
Oct 24 #PHP
You might like
php基础知识:类与对象(1)
2006/12/13 PHP
PHP 图像尺寸调整代码
2010/05/26 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
Jquery iframe内部出滚动条
2010/02/11 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
基于javascript 闭包基础分享
2013/07/10 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
Vue指令实现OutClick的示例
2020/11/16 Javascript
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
python函数局部变量用法实例分析
2015/08/04 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
详解python编译器和解释器的区别
2019/06/24 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
python各种excel写入方式的速度对比
2020/11/10 Python
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
防灾减灾活动总结
2014/08/30 职场文书
用Python提取PDF表格的方法
2021/04/11 Python