文档章节

敏感词过滤算法

M
 Mr-Yang
发布于 2017/08/29 15:56
字数 781
阅读 68
收藏 1

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

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++
    

 

© 著作权归作者所有

共有 人打赏支持
M
粉丝 0
博文 7
码字总数 2285
作品 0
松江
编程珠玑 - 算法优化 - 过滤敏感词

编程珠玑 - 算法优化 - 过滤敏感词 - 第一步:快速实现 http://my.oschina.net/fangxu/blog/32380 编程珠玑 - 算法优化 - 过滤敏感词 - 第二步:效率问题 http://my.oschina.net/fangxu/blo...

方旭
2011/09/21
4.7K
12
基于DFA敏感词查询的算法简析

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: a.直接将敏感词组织成S...

李晓晖
2016/10/14
0
0
利用函数计算实现网络游戏或视频直播中的敏感词检测

一、概述 目前,网络游戏和视频直播都是很火爆的产业,然而,无论在多人在线网络游戏(MMORPG)中,还是在游戏视频直播或者其他直播中(弹幕),玩家或者用户的在线交流和互动都是它们的核心乐趣...

rsong
2017/12/26
0
0
java --敏感词汇过滤

每个app的评论(或提问等)功能都会做敏感词过滤。 1.常规做法 当数据量很大的时候,如上的方法执行效率特别慢,因此需要找改进的方法,如下有一篇文章写的不错 http://www.cnblogs.com/chens...

求是科技
2016/09/29
68
0
用于检测敏感词的 PHP 扩展

敏感词过滤是我朝程序员必须具备的一种特殊技能,随着敏感词越来越多,是时候写个扩展来快速的进行敏感词检测了 使用说明 1. 安装 libdatrie tar zxf libdatrie-0.2.4.tar.gz cd libdatrie-...

mickelfeng
2013/05/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Akka的Actor生命周期《Eight》译

Actor在创建时出现,然后在用户请求时停止。每当一个Actor停止时,它的所有孩子也会被递归停止。此行为极大地简化了资源清理,并有助于避免资源泄漏,例如由打开的套接字和文件引起的资源泄漏...

woshixin
8分钟前
0
0
Python 线程 条件锁 生产者消费者模型

创建多个生产者和消费者,并且加上条件锁,避免线程冲突 import threadingfrom threading import Threadfrom threading import Conditionimport timeimport randomc = Conditi...

阿豪boy
25分钟前
0
0
【七】组合Action

本章描述了常用定义Action的方法。 自定义action builders 我们在action一章已经看过如何声明一个action——有request parameter、无request parameter、有body parser等等。你可以在 asynch...

Landas
41分钟前
0
0
Spring Boot实战之基础回顾

本文作者: 吴伟祥 本文链接: https://wuweixiang.cn/2018/08/21/Spring-Boot实战之基础回顾/ 版权声明: 本博客所有文章除特别声明外均为原创,采用CC BY-NC-SA 4.0 许可协议。转载请在文章开...

吴伟祥
42分钟前
0
0
OAuth认证开发

提示: 以下测试是基于项目安装成功,初始化数据库(initial_db.ddl, oauth.ddl, initial_data.ddl)后的测试, 也可在页面上点击"client_details"菜单里进行测试 方式1:基于浏览器 (grant_type=...

舒文joven
50分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部