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 相关文章推荐
使用sockets:从新闻组中获取文章(二)
Oct 09 PHP
Windows下的PHP5.0详解
Nov 18 PHP
php基础知识:类与对象(5) static
Dec 13 PHP
解决MySQL中文输出变成问号的问题
Jun 05 PHP
php通过COM类调用组件的实现代码
Jan 11 PHP
PHP中获取文件扩展名的N种方法小结
Feb 27 PHP
PHP 生成N个不重复的随机数
Jan 21 PHP
php生成4位数字验证码的实现代码
Nov 23 PHP
PHP调用Mailgun发送邮件的方法
May 04 PHP
PHP实现电商订单自动确认收货redis队列
May 17 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
php微信公众号开发之秒杀
Oct 20 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
ThinkPHP模板输出display用法分析
2014/11/26 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
2015/12/02 PHP
DOM相关内容速查手册
2007/02/07 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
2015/01/02 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
实现jquery放大镜的两种方法
2018/02/22 jQuery
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
python配置grpc环境
2019/01/01 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
python下载库的步骤方法
2019/10/12 Python
Python API len函数操作过程解析
2020/03/05 Python
python编写一个会算账的脚本的示例代码
2020/06/02 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
英国领先的露营和露营车品牌之一:OLPRO
2019/08/06 全球购物
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
酒店经理职责
2014/01/30 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
实习证明格式范文
2014/10/14 职场文书
小学教师个人工作总结2015
2015/04/20 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
党员理论学习心得体会
2016/01/21 职场文书
总结Pyinstaller打包的高级用法
2021/06/28 Python
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript