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 分页类(模仿google)-面试题目解答
Sep 13 PHP
ecshop 订单确认中显示省市地址信息的方法
Mar 15 PHP
PHP变量内存分配问题记录整理
Nov 27 PHP
PHP操作文件的一些基本函数使用示例
Nov 18 PHP
php去除头尾空格的2种方法
Mar 16 PHP
php目录拷贝实现方法
Jul 10 PHP
让你的PHP7更快之Hugepage用法分析
May 31 PHP
详解php curl带有csrf-token验证模拟提交方法
Apr 18 PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 PHP
php操作redis常见方法示例【key与value操作】
Apr 14 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 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+javascript模拟Matrix画面
2006/10/09 PHP
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
PHP中overload与override的区别
2017/02/13 PHP
mongodb和php的用法详解
2019/03/25 PHP
jQuery后代选择器用法实例
2014/12/23 Javascript
JavaScript中DOM详解
2015/04/13 Javascript
jQuery实现仿百度帖吧头部固定导航效果
2015/08/07 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
2016/08/01 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
js实现中文实时时钟
2020/01/15 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
Python有序字典简单实现方法示例
2017/09/28 Python
解决Opencv+Python cv2.imshow闪退问题
2020/04/24 Python
Python Json数据文件操作原理解析
2020/05/09 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
给小学生的新年寄语
2014/04/04 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
2016教师国培研修感言
2015/12/08 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
导游词之唐山景点
2019/12/18 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
vue3中provide && inject的使用
2021/07/01 Vue.js
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电