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版(2)
Oct 09 PHP
PHP date函数参数详解
Nov 27 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
Jun 27 PHP
PHP中使用SimpleXML检查XML文件结构实例
Jan 07 PHP
PHP中header函数的用法及其注意事项详解
Jun 13 PHP
PHP实现JS中escape与unescape的方法
Jul 11 PHP
Yii2.0中使用js异步删除示例
Mar 10 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
PHP递归算法的简单实例
Feb 28 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
Oct 12 PHP
PHP实现简单用户登录界面
Oct 23 PHP
thinkphp框架类库扩展操作示例
Nov 26 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语法速查表
2006/12/06 PHP
PHP脚本中include文件出错解决方法
2008/11/20 PHP
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
setAttribute 与 class冲突解决
2008/02/17 Javascript
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
JavaScript中的排序算法代码
2011/02/22 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
2012/05/23 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
详解nodejs通过响应回写的方式渲染页面资源
2018/04/07 NodeJs
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
2019/12/06 Javascript
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
python科学计算之narray对象用法
2019/11/25 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
外科实习自我鉴定
2013/10/06 职场文书
网站设计师的岗位职责
2013/11/21 职场文书
端午节活动策划方案
2014/03/09 职场文书
家长会开场白和结束语
2015/05/29 职场文书
个人更名证明
2015/06/23 职场文书
初三英语教学反思
2016/02/15 职场文书
golang定时器
2022/04/14 Golang