漢字轉拼音 敏感詞過濾 禁用詞查找 提高程序效率另外一種思路:反向思維 原

漢字轉拼音

敏感詞過濾

禁用詞查找

這些很常用的互聯網需求

大家出道時是怎麼做的?

大家偷懶時是怎麼做的?

常規算法 - 從數據庫到用戶提交內容去匹配:

  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.對開發人員素質要求較高









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章