博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汉字转拼音 敏感词过滤 禁用词查找 提高程序效率另外一种思路:反向思维
阅读量:5862 次
发布时间:2019-06-19

本文共 1795 字,大约阅读时间需要 5 分钟。

  hot3.png

汉字转拼音

敏感词过滤

禁用词查找

这些很常用的互联网需求

大家出道时是怎么做的?

大家偷懒时是怎么做的?

常规算法 - 从数据库到用户提交内容去匹配:

  1. 把数据库中所有数据压到大数组中(这时数据越多,与数据库连接时间越长)
  2. 根据用户提交的内容对大数组进行foreach(这时数据越多,占有服务器内存越大)
  3. 根据上述结果,进行相应的返回、处理(这时数据越多,与数据库连接时间越长)

优点:

  1. 逻辑简单,实施方便,开发成本低,人算素质要求低

缺点:

  1. 程序效率低,数据库压力大,速度慢
  2. 有bug,比如数据库中禁用词是shop,但是用户提交的是bookshop,那么就会匹配到shop,形成bug

值此圣诞节来临之举,http://my.oschina.net/cart/向大家推荐一种新的反向思维解决思路:

新算法:用户提交数据分词算法 - 从用户提交内容到数据库去匹配

  • 1.根据用户提交的信息进行分词
function cutWord($str){        $temp = array();        $len = mb_strlen($str, 'utf-8');                for($i=0; $i<=$len; $i++){            for($j=$len-$i; $j>0; $j--){                $temp[] = mb_substr($str, $i, $j, 'utf-8');            }        }                return $temp;}$str = '管理员';var_dump(cutWord($str));

分词后,我们得到以下数据,当然,上述算法是分割到最后一个词的

如果需要最低2个词的组合,因为1个字构不成实体意义,一般不会成为禁用词,那么可以限制最少2个字

太长的分词,比如已经超过5个字的词,是不会发生的,那么你也可以限制最多5个字

掌握的是思想、原理,算法可以灵活改动。

array(6) {  [0]=>  string(9) "管理员"  [1]=>  string(6) "管理"  [2]=>  string(3) "管"  [3]=>  string(6) "理员"  [4]=>  string(3) "理"  [5]=>  string(3) "员"}

  • 2.根据上述分词结果,使用事务批量提交到Redis,或者查找到1个禁用词后,立即退出,提高效率

如果是关系型数据库,如Mysql,分词后可以拼接SQL语句形如(word字段建立了唯一索引):

where word LIKE '管' OR word LIKE '理' OR word LIKE '管理' OR ..... LIMIT 0,1;

1句基于索引且找到就停止了(LIMIT 0,1)的SQL就搞定!效率也是杠杠的!

function isDisableWord($str){    $redis = new \redis(你的IP, 你的端口);		//$result = array();	//$redis->multi();    foreach($this->cutWord($str) as $v){		//$result[] = $redis->SISMEMBER('nameList', $v);        if($redis->SISMEMBER('nameList', $v)){            return $v;        }    }	//$redis->exec();	//return $result;    return false;}

$name = trim('弗兰克鲁宾逊');if(isDisableWord($name) === false){    echo '1.OK!';}else{    echo '1.禁止词语是:';    var_dump(isDisableWord($name));}

优点:

1.事务提交(主键索引、无大数据占有内存),一次性数据库操作数据库压力小,运行速度快

缺点:

1.对开发人员素质要求较高

转载于:https://my.oschina.net/cart/blog/356686

你可能感兴趣的文章
一元多项式相加
查看>>
commandLink/commandButton/ajax backing bean action/listener method not invoked (转)
查看>>
(一) pyhon 基础语法(数值 字符串 元组 列表 字典)
查看>>
HDOJ 1003:求一串数字中和最大的连续子串
查看>>
RedHat 5.6_x86_64 + ASM + RAW+ Oracle 10g RAC (二)
查看>>
MySQL/InnoDB的并发插入Concurrent Insert
查看>>
转两好文防丢:Debian 版本升级/降级 & Linux 应用程序失去输入焦点问题的解决...
查看>>
HDU - Pseudoforest
查看>>
Nexus杂
查看>>
Linux平台Java调用so库-JNI使用例子
查看>>
Web服务器压力测试工具http_load、webbench、ab、Siege使用教程
查看>>
Mac软件下载备忘
查看>>
在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory
查看>>
就是一个表格
查看>>
找回使用Eclipse删除的文件
查看>>
集成spring3、hibernate4、junit
查看>>
URL与ASCII
查看>>
java读取properties配置文件
查看>>
UITableview中cell重用引起的内容重复的问题
查看>>
Windows7操作系统安装教程(图文)
查看>>