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 04 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
Jul 02 PHP
简单的php文件上传(实例)
Oct 27 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
Apr 10 PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
Apr 29 PHP
php实现格式化多行文本为Js可用格式
Apr 15 PHP
PHP数组实例详解
Jun 26 PHP
Thinkphp实现短信验证注册功能
Oct 18 PHP
PHP未登录自动跳转到登录页面
Dec 21 PHP
PHP生成腾讯云COS接口需要的请求签名
May 20 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 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中的路径问题与set_include_path使用介绍
2014/02/11 PHP
一个非常完美的读写ini格式的PHP配置类分享
2015/02/12 PHP
PHP类的自动加载与命名空间用法实例分析
2020/06/05 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
2016/01/18 Javascript
Bootstrap框架下下拉框select搜索功能
2020/03/26 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
2018/12/05 jQuery
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
python 删除系统中的文件(按时间,大小,扩展名)
2020/11/19 Python
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
C语言如何决定使用那种整数类型
2016/11/26 面试题
介绍一下mysql的日期和时间函数
2013/03/28 面试题
介绍一些UNIX常用简单命令
2014/11/11 面试题
室内设计实习自我鉴定
2013/09/25 职场文书
致800米运动员广播稿
2014/02/16 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
请假条标准格式规范
2014/04/10 职场文书
检察院起诉意见书
2015/05/20 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
导游词之张家口
2019/12/13 职场文书
Django中的JWT身份验证的实现
2021/05/07 Python
opencv读取视频并保存图像的方法
2021/06/04 Python