PHP similar_text()、levenshtein()、lcs()支持中文汉字版

PHP 原生的similar_text()函数、levenshtein()函数对中文汉字支持不好,我自己写了一个

similar_text()中文汉字版

 1     <?php
 2     //拆分字符串
 3     function split_str($str) {
 4       preg_match_all("/./u", $str, $arr);
 5       return $arr[0];
 6     }
 7
 8     //相似度检测
 9     function similar_text_cn($str1, $str2) {
10       $arr_1 = array_unique(split_str($str1));
11       $arr_2 = array_unique(split_str($str2));
12       $similarity = count($arr_2) - count(array_diff($arr_2, $arr_1));
13
14       return $similarity;
15     }  

levenshtein()中文汉字版

 1     <?php
 2     //拆分字符串
 3     function mbStringToArray($string, $encoding = ‘UTF-8‘) {
 4         $arrayResult = array();
 5
 6         while ($iLen = mb_strlen($string, $encoding)) {
 7             array_push($arrayResult, mb_substr($string, 0, 1, $encoding));
 8             $string = mb_substr($string, 1, $iLen, $encoding);
 9         }
10
11         return $arrayResult;
12     }
13
14     //编辑距离
15     function levenshtein_cn($str1, $str2, $costReplace = 1, $encoding = ‘UTF-8‘) {
16         $count_same_letter = 0;
17         $d = array();
18
19         $mb_len1 = mb_strlen($str1, $encoding);
20         $mb_len2 = mb_strlen($str2, $encoding);
21
22         $mb_str1 = mbStringToArray($str1, $encoding);
23         $mb_str2 = mbStringToArray($str2, $encoding);
24
25         for ($i1 = 0; $i1 <= $mb_len1; $i1++) {
26             $d[$i1] = array();
27             $d[$i1][0] = $i1;
28         }
29
30         for ($i2 = 0; $i2 <= $mb_len2; $i2++) {
31             $d[0][$i2] = $i2;
32         }
33
34         for ($i1 = 1; $i1 <= $mb_len1; $i1++) {
35             for ($i2 = 1; $i2 <= $mb_len2; $i2++) {
36                 // $cost = ($str1[$i1 - 1] == $str2[$i2 - 1]) ? 0 : 1;
37                 if ($mb_str1[$i1 - 1] === $mb_str2[$i2 - 1]) {
38                     $cost = 0;
39                     $count_same_letter++;
40                 } else {
41                     $cost = $costReplace; //替换
42                 }
43
44                 $d[$i1][$i2] = min($d[$i1 - 1][$i2] + 1, //插入
45                 $d[$i1][$i2 - 1] + 1, //删除
46                 $d[$i1 - 1][$i2 - 1] + $cost);
47             }
48         }
49
50         return $d[$mb_len1][$mb_len2];
51         //return array(‘distance‘ => $d[$mb_len1][$mb_len2], ‘count_same_letter‘ => $count_same_letter);
52     }  

最长公共子序列LCS()

 1         <?php
 2         //最长公共子序列英文版
 3         function LCS_en($str_1, $str_2) {
 4           $len_1 = strlen($str_1);
 5           $len_2 = strlen($str_2);
 6           $len = $len_1 > $len_2 ? $len_1 : $len_2;
 7
 8           $dp = array();
 9           for ($i = 0; $i <= $len; $i++) {
10             $dp[$i] = array();
11             $dp[$i][0] = 0;
12             $dp[0][$i] = 0;
13           }
14
15           for ($i = 1; $i <= $len_1; $i++) {
16             for ($j = 1; $j <= $len_2; $j++) {
17               if ($str_1[$i - 1] == $str_2[$j - 1]) {
18                 $dp[$i][$j] = $dp[$i - 1][$j - 1] + 1;
19               } else {
20                 $dp[$i][$j] = $dp[$i - 1][$j] > $dp[$i][$j - 1] ? $dp[$i - 1][$j] : $dp[$i][$j - 1];
21               }
22             }
23           }
24
25           return $dp[$len_1][$len_2];
26         }
27
28         //拆分字符串
29         function mbStringToArray($string, $encoding = ‘UTF-8‘) {
30           $arrayResult = array();
31
32           while ($iLen = mb_strlen($string, $encoding)) {
33             array_push($arrayResult, mb_substr($string, 0, 1, $encoding));
34             $string = mb_substr($string, 1, $iLen, $encoding);
35           }
36
37           return $arrayResult;
38         }
39
40         //最长公共子序列中文版
41         function LCS_cn($str1, $str2, $encoding = ‘UTF-8‘) {
42           $mb_len1 = mb_strlen($str1, $encoding);
43           $mb_len2 = mb_strlen($str2, $encoding);
44
45           $mb_str1 = mbStringToArray($str1, $encoding);
46           $mb_str2 = mbStringToArray($str2, $encoding);
47
48           $len = $mb_len1 > $mb_len2 ? $mb_len1 : $mb_len2;
49
50           $dp = array();
51           for ($i = 0; $i <= $len; $i++) {
52             $dp[$i] = array();
53             $dp[$i][0] = 0;
54             $dp[0][$i] = 0;
55           }
56
57           for ($i = 1; $i <= $mb_len1; $i++) {
58             for ($j = 1; $j <= $mb_len2; $j++) {
59               if ($mb_str1[$i - 1] == $mb_str2[$j - 1]) {
60                 $dp[$i][$j] = $dp[$i - 1][$j - 1] + 1;
61               } else {
62                 $dp[$i][$j] = $dp[$i - 1][$j] > $dp[$i][$j - 1] ? $dp[$i - 1][$j] : $dp[$i][$j - 1];
63               }
64             }
65           }
66
67           return $dp[$mb_len1][$mb_len2];
68         } 
时间: 2024-10-14 02:16:37

PHP similar_text()、levenshtein()、lcs()支持中文汉字版的相关文章

推荐ajaxfilemanager for tiny_mce 比较完善的tiny_mce编辑器的图片上传及图片管理插件PHP版 支持中文

tiny_mce编辑器,我觉得挺简洁.好用的,但就是图片上传的插件是收费的,而且网上找了半天也没有找到开源好用的上传插件. 不过功夫不负有心人,终于还就被我找到一款相当满意的插件. 这个插件的名字叫ajaxfilemanager 官方网址是http://www.phpletter.com/DOWNLOAD/ Tinymce Ajax File and Image Manager Tinymce Ajax File and Image Manager Version 1.0 Final Proje

浏览器 Chrome for Mac 73.0 中文正式版下载 – 支持深色模式

今天和大家分享最新的 Google Chrome 73.0 for Mac 版本,此版本最重要的更新则是支持了 macOS Mojave 的深色模式,推荐更新!Chrome 是Mac上最优秀的浏览器之一,具有速度快.插件多等特点,是Mac上除了Safari外的最好浏览器了! 下载地址: 浏览器 Chrome for Mac 73.0 中文正式版下载 – 支持深色模式 原文地址:https://www.cnblogs.com/Morus-alba/p/10534406.html

onlyoffice新版5.1.2版解决中文汉字

onlyoffice新版5.1.2版解决中文汉字 原文地址:https://www.cnblogs.com/hshy/p/12254087.html

Ubuntu CTRL+ALT+F1~F6 进入命令模式后不支持中文显示的解决办法

前言 我在实验进入linux系统启动xwindow server而不启动KDE GNOME等桌面系统时遇到的问题.只启动x server而不启动桌面系统,在xserver之上运行一个全屏的图形界面程序,这样就能实现该程序对显示器的独占,对一般用户来说他就不能在这台电脑上搞别的动作了,只能用这个程序.一些工业控制.超市收银等应用场景下都会有这样的需求,目前这些程序都运行在windows xp (embeded)之下,也有运行于dos的.由于windows xp太被大众熟悉了,结果这些软件便不能稳定

FlashFXP 5.0.0官方中文破解版,附文件下载地址和破解码

FlashFXP 5.0.0官方中文破解版是一个功能强大的 FXP/FTP 软件,融合了一些其他优秀 FTP 软件的优点,如像 CuteFTP 一样可以比较文件夹,支持彩色文字显示:像 BpFTP 支持多文件夹选择文件,能够缓存文件夹:像 LeapFTP 一样的外观界面,甚至设计思路也差相仿佛.支持文件夹(带子文件夹)的文件传送.删除:支持上传.下载及第三方文件续传:可以跳过指定的文件类型,只传送需要的文件:可以自定义不同文件类型的显示颜色:可以缓存远端文件夹列表,支持FTP代理及 Socks

FlashFXP 中文破解版+上传FTP

00.主题截图 简介: FlashFXP是一款功能强大的FXP/FTP软件,集成了其它优秀的FTP软件的优点,如CuteFTP的目录比较,支持彩色文字显示:如BpFTP支持多目录选择文件,暂存目录:又如LeapFTP的界面设计.支持目录(和子目录)的文件传输,删除:支持上传,下载,以及第三方文件续传:可以跳过指定的文件类型,只传送需要的本件:可自定义不同文件类型的显示颜色:暂存远程目录列表,支持FTP代理及Socks 3&4:有避免闲置断线功能,防止被FTP平台踢出:可显示或隐藏具有“隐藏”属性

编程写作人员的好帮手 - Evernote 5.4(印象笔记) 中文绿色版

Evernote (中文名称:印象笔记) 是一个免费且优秀的笔记软件或个人知识管理软件,可以帮助你有效的管理各类电子笔记.资料等:xbeta 写过很多信息管理或 Evernote 方面的文章,认为 Evernote 适于管理微而多而乱的信息体. EverNote界面与功能十分类似OneNote.它不仅具备强大的笔记捕捉功能,还采用了独特的分类方式,而且支持filter的自动整理.即时搜索.含中文界面.利用印象笔记,随时随地记录一切有价值的信息,随时查询,一辈子不忘记. Evernote 的 Ta

helm-mode打开文件支持中文搜索

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-family: monospace; color: red } .done { font-family: monospace; color: green } .priority { font-fami

【APP设计利器】Sketch 41 Mac中文破解版(含汉化插件)

Sketch是一款拥有美观界面和强大功能适用于所有设计师的专业矢量绘图工具.它旨在为美术设计师创造出一款更优秀的作品,不是复制品,而是提升品.Sketch简约的设计是基于无限的规模和层次的绘图空间,免费调色板,面板,菜单,窗口和控件.虽然使用简单,它提供了功能强大的矢量绘图和文字工具.如完美的布尔运算,符号,和强大的标尺,参考线和网格.相比其他的矢量绘图软件,比如AI,Sketch的优点在于使用简单,学习曲线低,可以说是轻量级的 AI.Sketch 3 提供了基本的形状,支持自动切图,PDF.E