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 相关文章推荐
html中select语句读取mysql表中内容
Oct 09 PHP
php读取30天之内的根据算法排序的代码
Apr 06 PHP
PHPCMS的使用小结
Sep 20 PHP
PHP中foreach循环中使用引用要注意的地方
Jan 02 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
Mar 09 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
Oct 31 PHP
PHP性能优化准备篇图解PEAR安装
Dec 05 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
php使用curl打开https网站的方法
Jun 17 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
php压缩文件夹最新版
Jul 18 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
Oct 30 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操作MongoDB的技术总结
2013/06/02 PHP
关于js与php互相传值的介绍
2013/06/25 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
js如何实现设计模式中的模板方法
2013/07/23 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
vue实现行列转换的一种方法
2019/08/06 Javascript
python实现12306火车票查询器
2017/04/20 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
详解Python中的type和object
2018/08/15 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
Python 支付整合开发包的实现
2019/01/23 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
python生成特定分布数的实例
2019/12/05 Python
Python自动创建Excel并获取内容
2020/09/16 Python
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
美国一家著名的手表在线折扣网站:Discount Watch Store
2020/02/24 全球购物
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
个人自我评价和职业目标
2014/01/24 职场文书
人事主管岗位职责
2014/01/30 职场文书
绘画专业自荐信范文
2014/02/23 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
电子商务专业应届毕业生求职信
2014/06/21 职场文书
企业授权委托书范本
2014/09/22 职场文书
基层党建工作简报
2015/07/21 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
Python实现简繁体转换
2021/06/07 Python
Java 超详细讲解数据结构中的堆的应用
2022/04/02 Java/Android
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android