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 相关文章推荐
我的论坛源代码(八)
Oct 09 PHP
WindowsXP中快速配置Apache+PHP5+Mysql
Jun 05 PHP
用php或asp创建网页桌面快捷方式的代码
Mar 23 PHP
php 将字符串按大写字母分隔成字符串数组
Apr 30 PHP
探讨PHP调用时间格式的参数详解
Jun 06 PHP
php批量上传的实现代码
Jun 09 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
yii2使用gridView实现下拉列表筛选数据
Apr 10 PHP
微信封装的调用微信签名包的类库
Jun 08 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 PHP
深入解析PHP底层机制及相关原理
Dec 11 PHP
windows系统php环境安装swoole具体步骤
Mar 04 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
一个改进的UBB类
2006/10/09 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
学习并汇集javascript匿名函数
2010/11/25 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
python实现文本去重且不打乱原本顺序
2016/01/26 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
Python IDLE清空窗口的实例
2018/06/25 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
python os模块简单应用示例
2019/05/23 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
澳大利亚领先的在线药房:Pharmacy Online(有中文站)
2020/02/22 全球购物
大学毕业生简单自荐信
2013/11/05 职场文书
仓管员岗位职责范文
2013/11/08 职场文书
小学生期末评语
2014/04/21 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
银行求职自荐书
2014/06/25 职场文书
个人房屋买卖协议书(范本)
2014/10/04 职场文书
2014五年级班主任工作总结
2014/12/05 职场文书
云冈石窟导游词
2015/02/04 职场文书
北京英语导游词
2015/02/12 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
导游词之井冈山
2019/11/20 职场文书
python实现进度条的多种实现
2021/04/29 Python
PyCharm 安装与使用配置教程(windows,mac通用)
2021/05/12 Python
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL