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 相关文章推荐
JAVA/JSP学习系列之四
Oct 09 PHP
收集的二十一个实用便利的PHP函数代码
Apr 22 PHP
PHP include_path设置技巧分享
Jul 03 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
thinkPHP的Html模板标签使用方法
Nov 13 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
destoon实现资讯信息前面调用它所属分类的方法
Jul 15 PHP
php使用MySQL保存session会话的方法
Jun 18 PHP
php 魔术常量详解及实例代码
Dec 04 PHP
PHP中PDO事务处理操作示例
May 02 PHP
PHP聊天室简单实现方法详解
Dec 08 PHP
深入理解PHP+Mysql分布式事务与解决方案
Dec 03 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 date函数参数详解
2006/11/27 PHP
简单实用的.net DataTable导出Execl
2013/10/28 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
各种常用的JS函数整理
2013/10/25 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
2018/11/26 Javascript
vue-router传参用法详解
2019/01/19 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
Vue实现图书管理案例
2021/01/20 Vue.js
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
Python变量和字符串详解
2017/04/29 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
Python 使用office365邮箱的示例
2020/10/29 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
制定岗位职责的原则
2013/11/08 职场文书
护士思想汇报
2014/01/12 职场文书
测控技术自荐信
2014/06/05 职场文书
任命书怎么写
2015/03/02 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
村官2015年度工作总结
2015/10/14 职场文书