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 相关文章推荐
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
Oct 09 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
Dec 07 PHP
深入php数据采集的详解
Jun 02 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
php实现singleton()单例模式实例
Nov 06 PHP
Thinkphp无限级分类代码
Nov 11 PHP
Symfony2联合查询实现方法
Mar 18 PHP
PHP简单实现DES加密解密的方法
Jul 12 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
Nov 08 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
Apr 20 PHP
在laravel中使用with实现动态添加where条件
Oct 10 PHP
laravel 5.5 关闭token的3种实现方式
Oct 24 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/28 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
我见过最全的个人js加解密功能页面
2007/12/12 Javascript
Javascript面向对象编程(三) 非构造函数的继承
2011/08/28 Javascript
javascript语言结构小记(一)
2011/09/10 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
微信小程序模板之分页滑动栏
2017/02/10 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
2018/08/09 jQuery
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
Python判断直线和矩形是否相交的方法
2015/07/14 Python
Python随手笔记之标准类型内建函数
2015/12/02 Python
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
python实现简易通讯录修改版
2018/03/13 Python
python web基础之加载静态文件实例
2018/03/20 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
python用列表生成式写嵌套循环的方法
2018/11/08 Python
Python3.5运算符操作实例详解
2019/04/25 Python
Python 音频生成器的实现示例
2019/12/24 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
安全生产承诺书
2014/03/26 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
golang 实用库gotable的具体使用
2021/07/01 Golang