漢字轉拼音
敏感詞過濾
禁用詞查找
這些很常用的互聯網需求
大家出道時是怎麼做的?
大家偷懶時是怎麼做的?
常規算法 - 從數據庫到用戶提交內容去匹配:
- 把數據庫中所有數據壓到大數組中(這時數據越多,與數據庫連接時間越長)
- 根據用戶提交的內容對大數組進行foreach(這時數據越多,佔有服務器內存越大)
- 根據上述結果,進行相應的返回、處理(這時數據越多,與數據庫連接時間越長)
優點:
- 邏輯簡單,實施方便,開發成本低,人算素質要求低
缺點:
- 程序效率低,數據庫壓力大,速度慢
- 有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.對開發人員素質要求較高