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 相关文章推荐
ionCube 一款类似zend的PHP加密/解密工具
Jul 25 PHP
PHP日期处理函数 整型日期格式
Jan 12 PHP
基于curl数据采集之正则处理函数get_matches的使用
Apr 28 PHP
关于svn冲突的解决方法
Jun 21 PHP
关于php内存不够用的快速解决方法
Oct 26 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
Jul 25 PHP
PHP利用header跳转失效的解决方法
Oct 24 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
Jun 28 PHP
Laravel中10个有用的用法小结
May 06 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
Jul 18 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 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取得一个类的属性和方法的实现代码
2011/05/22 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
使用python实现生成用户信息
2017/03/20 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
python实现简单井字棋游戏
2020/03/04 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
2020/04/01 Python
突破canvas语法限制 让他支持链式语法
2012/12/24 HTML / CSS
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
高中生期末评语大全
2014/01/28 职场文书
临床护士自荐信
2014/01/31 职场文书
教师学习培训邀请函
2014/02/04 职场文书
小班秋游活动方案
2014/02/22 职场文书
中学生操行评语大全
2014/04/24 职场文书
2014年村官工作总结
2014/11/24 职场文书
酒店客房服务员岗位职责
2015/04/09 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
mysql 生成连续日期及变量赋值
2022/03/20 MySQL
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL