敏感詞過濾算法

遊戲聊天中敏感詞過濾算法python

set<string> sensitiveSet:爲全部敏感詞的set集合算法

uint8_t charTable[256]: 每個敏感字符轉換成uint8_t作爲下標,值爲這個敏感字符所在敏感詞中對應的二進制位,好比有敏感詞sb,字符s轉換成uint8是115,b是98,ui

charTable以下code

charTable[115] = 1    //s在第一位
charTable[98] = 10    //b再第二位索引

若是字符對應多個敏感詞不一樣位置就用或運算。若是還有個敏感詞shabi,charTable以下
s:115 h:104 a:97 b:98 i:105
charTable[115] = 1      //s都在第一位因此不變
charTable[104] = 10     //h在第二位
charTable[97] = 100     //a再第三位
charTable[98] = 1010    //sb中b還在第二位,shabi中b在第四位
charTable[105] = 10000  //i在第五位遊戲

uint8_t lengthTable[256]:每個敏感詞開始字符作下標,值爲敏感詞長度對應二進制bit位,好比長度爲2時就是10,長度爲4時就是1000string

uint8_t endCharTable[256]:每個敏感詞最後一個字符作下標,值爲1,
好比有sb,shabi兩個敏感詞,endCharTable[105] = 1,endCharTable[98] = 1it

好比content = "你當我是sb嗎"
1.遍歷content每一個字符去charTable中索引,
2.若是存在而且與1(&1)不爲0時說明這個字符是某一個敏感詞的首字符(好比到s時就會確認s爲某個敏感詞的首字符)若是是敏感字符就記下當前字符的下標(在上句話中就是8),不然回到1
3.而後取下一個字符若是存在而且與10(&10)不爲0時匹配第二個字符繼續下一步,不然說明第二個敏感字符匹配失敗放棄此次匹配,回到1繼續遍歷下個字符。
4.當第二個字符匹配成功時就能夠對比長度了,方法是用s索引lengthTable的值與當前匹配長度的二進制位與運算而且大於0繼續下一步,
(結合例子咱們已經匹配到sb的b了就是第二2個那麼就是10),不然回到3
5.而後再肯定敏感詞末尾字符,用b索引endCharTable爲1時繼續,不然回到3
6.若是上面4和5都匹配成功就去sensitiveSet裏面去查找sb,若是有替換*就能夠了,不然回到3class

這裏說下上面charTable的&1和&10,由於charTable對應的就是字符再敏感詞中的位置,因此&1去匹配第一位敏感詞,&10匹配第二位敏感詞,&100匹配第三位。。。。以此類推,因此上面4 5 6步失敗時繼續取下一個字符匹配時要知道當前匹配的是敏感詞中第幾個字符遍歷

下面是僞代碼

while index < content.length
    if charTable[content[index]] & 1 == 0   #2
        index++
        continue
    first = content[index]
    for k = 1; k < content.length - index; k++
        currChar = content[index+k]
        if (charTable[currChar] & (1 << k)) == 0    #3
            break
        if (lengthTable[first] & (1 << k)) > 0 && endCharTable[currChar] == 1   #4 5
            subStr = content.substr(index, k+1)
            if sensitiveSet.find(subStr)    #6
                content.replace(index, k+1, k+1, '*')
    
    index++
相關文章
相關標籤/搜索