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数组的维度
Jun 10 PHP
利用php下载xls文件(自己动手写的)
Apr 18 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
Mar 18 PHP
使用新浪微博API的OAuth认证发布微博实例
Mar 27 PHP
作为程序员必知的16个最佳PHP库
Dec 09 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
Jan 08 PHP
php文件上传的两种实现方法
Apr 04 PHP
PHP中模糊查询并关联三个select框
Jun 19 PHP
Yii2使用表单上传文件的实例代码
Aug 03 PHP
PHP时间处理类操作示例
Sep 05 PHP
PHP的简单跳转提示的实现详解
Mar 14 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 PDO中文乱码解决办法
2009/07/20 PHP
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
PHP中echo,print_r与var_dump区别分析
2014/09/29 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
JavaScript File分段上传
2016/03/10 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
JavaScript中的工厂函数(推荐)
2017/03/08 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
javascript实现下拉菜单效果
2021/02/09 Javascript
python实现在IDLE中输入多行的方法
2018/04/19 Python
pycharm配置git(图文教程)
2019/08/16 Python
Python爬虫实现模拟点击动态页面
2020/03/05 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
Django实现随机图形验证码的示例
2020/10/15 Python
Python通过字典映射函数实现switch
2020/11/06 Python
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
商务英语专业毕业生求职信
2014/07/06 职场文书
2014年林业工作总结
2014/12/05 职场文书
前台岗位职责
2015/02/13 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python