敏感词过滤算法
博客专区 > Mr-Yang 的博客 > 博客详情
敏感词过滤算法
Mr-Yang 发表于2个月前
敏感词过滤算法
  • 发表于 2个月前
  • 阅读 32
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

游戏聊天中敏感词过滤算法

set<string> sensitiveSet:为所有敏感词的set集合

uint8_t charTable[256]: 每一个敏感字符转换成uint8_t做为下标,值为这个敏感字符所在敏感词中对应的二进制位,比如有敏感词sb,字符s转换成uint8是115,b是98,

charTable如下

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时就是1000

uint8_t endCharTable[256]:每一个敏感词最后一个字符做下标,值为1,
比如有sb,shabi两个敏感词,endCharTable[105] = 1,endCharTable[98] = 1

比如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,如果有替换*就可以了,否则回到3

这里说下上面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++
    

 

共有 人打赏支持
粉丝 0
博文 6
码字总数 2215
×
Mr-Yang
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: