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制作静态网站的模板框架(四)
Oct 09 PHP
PHP中的日期处理方法集锦
Jan 02 PHP
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
Jan 29 PHP
PHP 提取图片img标记中的任意属性的简单实例
Dec 10 PHP
symfony表单与页面实现技巧
Jan 26 PHP
PHP连接access数据库
Mar 27 PHP
php微信公众号开发(4)php实现自定义关键字回复
Dec 15 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
php面试实现反射注入的详细方法
Sep 30 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
May 02 PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 PHP
thinkphp5.1 框架钩子和行为用法实例分析
May 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的ob_start来生成静态页面的方法分析
2011/03/09 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
php使用PDO方法详解
2014/12/27 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
JavaScript的目的分析
2007/01/05 Javascript
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
Angular父组件调用子组件的方法
2018/04/02 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
2018/09/20 Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
2019/10/25 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
python继承和抽象类的实现方法
2015/01/14 Python
python实战教程之自动扫雷
2018/07/13 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
对python使用telnet实现弱密码登录的方法详解
2019/01/26 Python
python通过txt文件批量安装依赖包的实现步骤
2019/08/13 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
四种会话跟踪技术
2015/05/20 面试题
环境日宣传活动总结
2014/07/09 职场文书
MySQL去除密码登录告警的方法
2022/04/20 MySQL
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS