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&amp;&amp;mysql)六
Oct 09 PHP
php实现首页链接查询 友情链接检查的代码
Jan 05 PHP
PHP运行时强制显示出错信息的代码
Apr 20 PHP
phpize的深入理解
Jun 03 PHP
调整PHP的性能
Oct 30 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
php实现字符串翻转的方法
Mar 27 PHP
PHP版本常用的排序算法汇总
Dec 20 PHP
PHP使用token防止表单重复提交的方法
Apr 07 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
Apr 10 PHP
PHP判断当前使用的是什么浏览器(推荐)
Oct 27 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读取flv文件的播放时间长度
2009/09/03 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
2015/01/28 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
JavaScript函数详解
2015/02/27 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
jquery插件star-rating.js实现星级评分特效
2015/04/15 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
vue实现文件上传功能
2018/08/13 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
python开启debug模式的方法
2019/06/27 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
10张动图学会python循环与递归问题
2021/02/06 Python
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
护士感人事迹
2014/05/01 职场文书
企业承诺书怎么写
2014/05/24 职场文书
优秀求职信
2014/05/29 职场文书
运动员获奖感言
2014/08/15 职场文书
教师读书笔记
2015/06/29 职场文书
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript