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写的小东西
Dec 06 PHP
PHP与SQL注入攻击[三]
Apr 17 PHP
php对gzip文件或者字符串解压实例参考
Jul 25 PHP
php设计模式 Builder(建造者模式)
Jun 26 PHP
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
PHP 获取远程文件大小的3种解决方法
Jul 11 PHP
ThinkPHP实现二级循环读取的方法
Nov 03 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
Mar 27 PHP
PHP获取Exif缩略图的方法
Jul 13 PHP
Yii2下点击验证码的切换实例代码
Mar 14 PHP
php实现头像上传预览功能
Apr 27 PHP
PHP实现小程序批量通知推送
Nov 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
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
javascript 面向对象思想 附源码
2009/07/07 Javascript
js表头排序实现方法
2015/01/16 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
javascript实现文件拖拽事件
2018/03/29 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
JavaScript实现简单计算器功能
2019/12/19 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
Python的函数嵌套的使用方法
2014/01/24 Python
简单的Python2.7编程初学经验总结
2015/04/01 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
2016/01/20 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
基于Python闭包及其作用域详解
2017/08/28 Python
python微信公众号开发简单流程
2018/03/23 Python
QML实现钟表效果
2020/06/02 Python
CSS3 input框的实现代码类似Google登录的动画效果
2020/08/04 HTML / CSS
Goodee官方商店:迷你投影仪
2021/03/15 全球购物
函数指针的定义是什么
2016/08/14 面试题
焊接专业毕业生求职信
2013/10/01 职场文书
英语硕士生求职简历的自我评价
2013/10/15 职场文书
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
社团2014年植树节活动总结
2014/03/11 职场文书
《火烧云》教学反思
2014/04/12 职场文书
总经理人事任命书
2014/06/05 职场文书
高校教师个人总结
2015/02/10 职场文书
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫
Python读写yaml文件
2022/03/20 Python
mysql 排序失效
2022/05/20 MySQL