文档章节

敏感词过滤算法

M
 Mr-Yang
发布于 2017/08/29 15:56
字数 781
阅读 60
收藏 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++
    

 

© 著作权归作者所有

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

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

方旭 ⋅ 2011/09/21 ⋅ 12

Java实现敏感词过滤

敏感词、文字过滤是一个网站必不可少的功能,如何设计一个好的、高效的过滤算法是非常有必要的。前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非...

-蒋全忠- ⋅ 2015/05/21 ⋅ 0

基于DFA敏感词查询的算法简析

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

李晓晖 ⋅ 2016/10/14 ⋅ 0

利用函数计算实现网络游戏或视频直播中的敏感词检测

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

rsong ⋅ 2017/12/26 ⋅ 0

java --敏感词汇过滤

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

求是科技 ⋅ 2016/09/29 ⋅ 0

编程珠玑 - 算法优化 - 过滤敏感词 - 第六步:新的需求

第五步已经完成了所有工作,但是新的需求来了,就是发布广告的人有一些特殊字符来绕过敏感词判断,我们需要把特殊字符过滤掉,那么正常想法就是使用正则表达式来过滤,但是我们实现的这个算法...

方旭 ⋅ 2011/09/21 ⋅ 2

用于检测敏感词的 PHP 扩展

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

mickelfeng ⋅ 2013/05/25 ⋅ 0

敏感词过滤服务--bbspam

现今,Web2.0网站往往面临着一件非常窘困的事情。 对于用户的输入内容很难控制,那就意味着随时都有可能遇到"违禁词"、"敏感词",不是被迫删除信息,就是被强制和谐,或者投入大量的人力进行...

chancey ⋅ 2010/11/24 ⋅ 0

求指教,敏感词过滤问题

各位高手,请问在发帖的时候需要敏感词过滤,那这些敏感词过滤应该存放在哪里,数据库中,还是文件中。

jerry2012 ⋅ 2013/10/08 ⋅ 2

有个问题请教红薯老大下

老大,最近有个项目对 信息内容 的控制比较严格,对一些敏感词要进行过滤, 我有个模糊的印象 在论坛里看到过该类问题的贴子,找不到了,希望老大能分享下 敏感词过滤的实现思路(Java),或...

慢慢爬 ⋅ 2011/03/04 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java的Excel导出工具类

首先在POM中引入需要的Jar <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><dependency><groupId>o......

Kxvz ⋅ 1分钟前 ⋅ 0

Java 3DES加密解密

import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.binary.Base64; //算法代码[java] view plain copy /** * 转换成十六进制字......

说回答 ⋅ 8分钟前 ⋅ 0

php 浮点型计算精度问题

今天碰到一个金额计算的问题,浮点数做差,结果有误(精度有问题)。 $a = floatval('6');$b = floatval('4.99');$m = floatval('1');$r = $a - $b;$r = $r - $m;var_dump($r);//f...

stupidboy ⋅ 30分钟前 ⋅ 0

Mahout推荐算法之SlopOne

一、 算法原理 有别于基于用户的协同过滤和基于item的协同过滤,SlopeOne采用简单的线性模型估计用户对item的评分。如下图,估计UserB对ItemJ的偏好 图(1) 在真实情况下,该方法有如下几个...

xiaomin0322 ⋅ 34分钟前 ⋅ 0

LVM讲解

LVM是什么 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地...

李超小牛子 ⋅ 44分钟前 ⋅ 0

mysql更改密码、连接mysql、mysql常用命令

1. 更改mysql的root账户密码: mysql中root账户和系统root不是一个账户 1.1 更改环境变量PATH,增加mysql绝对路径 由于mysql安装目录为/usr/local/mysql/,所以系统不能直接使用mysql,需把/...

laoba ⋅ 45分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

猫耳m ⋅ 45分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云云栖社区 ⋅ 48分钟前 ⋅ 0

1.03-Maven中使用ueditor富文本编辑器

起因:在maven仓库未找到百度的ueditor的jar包 操作: 1.下载百度的ueditor的jar包 2.打开命令行,切换到ueditor的下载位置,运行一下命令: mvn install:install-file -Dfile=ueditor-1.1....

静以修身2025 ⋅ 54分钟前 ⋅ 0

几道Spring 面试题

1、BeanFactory 接口和 ApplicationContext 接口有什么区别? ApplicationContext 接口继承BeanFactory接口 Spring核心工厂是BeanFactory BeanFactory采取延迟加载,第一次getBean时才会初始...

职业搬砖20年 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部