游戏聊天中敏感词过滤算法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++