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 和 MySQL 基础教程(四)
Oct 09 PHP
php与php MySQL 之间的关系
Jul 17 PHP
apache配置虚拟主机的方法详解
Jun 17 PHP
php中OR与|| AND与&amp;&amp;的区别总结
Oct 26 PHP
用 Composer构建自己的 PHP 框架之基础准备
Oct 30 PHP
利用“多说”制作留言板、评论系统
Jul 14 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
Dec 17 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
CI配置多数据库访问的方法
Mar 28 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
Yii2框架可逆加密简单实现方法
Aug 25 PHP
Laravel配合jwt使用的方法实例
Oct 25 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 基本语法格式
2009/12/15 PHP
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
初学JavaScript第二章
2008/09/30 Javascript
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
jQuery实现的类flash菜单效果代码
2010/05/17 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
在javascript中关于节点内容加强
2013/04/11 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
解决小程序无法触发SESSION问题
2020/02/03 Javascript
详解vue父子组件状态同步的最佳方式
2020/09/10 Javascript
Python实现DDos攻击实例详解
2019/02/02 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
python 动态绘制爱心的示例
2020/09/27 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
法律工作求职自荐信
2013/10/31 职场文书
高级人员简历的自我评价分享
2013/11/03 职场文书
建筑项目策划书
2014/01/13 职场文书
中专毕业生自我鉴定
2014/02/02 职场文书
采购部经理岗位职责
2014/02/10 职场文书
干部现实表现材料
2014/02/13 职场文书
员工拓展培训方案
2014/02/15 职场文书
团员年度个人总结
2015/02/26 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python
Vue h函数的使用详解
2022/02/18 Vue.js