这是一款敏感词检测模块,判断句子中是否包含配置的敏感词,且支持直接判定是否存在敏感词 和 将敏感词过滤为*号 两种判定方式。
支持从缓存中读取敏感词前缀树。在每一次从敏感词源文件中逐行读取敏感词,并构建敏感词前缀树后,将敏感词的树节点转为二进制数据,存入文件中,同时记录源文件的MD5码。
下次再次调用Init()
函数时,当缓存文件存在时,校验缓存文件记录的源文件MD5码与当前源文件MD5码是否一致,如果一致,则敏感词文件未被修改过,此时从缓存文件读取,效率更高。
本模块不建议用户使用go get ...
进行安装,而是将sensitivecheck
文件夹放到自己的项目中,然后先调用Init()
方法初始化敏感词检测树,再调用MsgCheck
或MsgCheckFilter
进行检测。
- checkout本项目,运行
main.go
中的main()
函数,你将看到控制台输出结果。 代码:
// 初始化敏感词检测树
sensitivecheck.Init()
fmt.Println("使用判断敏感词是否存在,来检测内容:科比")
res := sensitivecheck.MsgCheck("科比")
fmt.Println("结果为: ", res)
fmt.Println("使用过滤敏感词为*号,来检测内容:科比")
res, filtered := sensitivecheck.MsgCheckFilter("我是科比")
fmt.Println("结果为: ", res, filtered)
fmt.Println("使用判断敏感词是否存在,来检测内容:你好")
res = sensitivecheck.MsgCheck("你好")
fmt.Println("结果为: ", res)
fmt.Println("使用过滤敏感词为*号,来检测内容:你好")
res, filtered = sensitivecheck.MsgCheckFilter("你好")
fmt.Println("结果为: ", res, filtered)
结果:
敏感词检查缓存文件 sensitiveCache.bin 打开失败, 重新加载敏感词检测树并保存 open sensitiveCache.bin: The system cannot find the file specified.
从源文件 sensitive.txt 中读取敏感词成功
写入树节点成功
使用判断敏感词是否存在,来检测内容:科比
检测到敏感词输入,玩家输入内容:科比, 命中内容:科比
结果为: false
使用过滤敏感词为*号,来检测内容:科比
检测到敏感词输入,玩家输入内容:我是科比, 命中内容:科比
结果为: false 我是**
使用判断敏感词是否存在,来检测内容:你好
结果为: true
使用过滤敏感词为*号,来检测内容:你好
结果为: true 你好
- 可以看到文件夹目录下出现
sensitiveCache.bin
文件,这个文件是敏感词树的缓存文件。再次运行main()
函数时,系统会从缓存文件中读取敏感词,将输出:
sensitive.txt MD5 checksum is 2cbc81470cc9949e55380b735e2e84af
从缓存文件 sensitiveCache.bin 中读取敏感词文件 成功
使用判断敏感词是否存在,来检测内容:科比
检测到敏感词输入,玩家输入内容:科比, 命中内容:科比
结果为: false
使用过滤敏感词为*号,来检测内容:科比
检测到敏感词输入,玩家输入内容:我是科比, 命中内容:科比
结果为: false 我是**
使用判断敏感词是否存在,来检测内容:你好
结果为: true
使用过滤敏感词为*号,来检测内容:你好
结果为: true 你好
- 你可以修改sensitive.txt中的敏感词,注意一行一个敏感词。
詹姆斯
科比
- 将
sensitivecheck
整个文件夹复制到你的golang项目中,作为一个包进行使用 - 在你项目中启动初始化的地方调用
sensitivecheck
包下的Init()
函数 - 在你项目中需要检测敏感词的地方,使用
sensitivecheck.MsgCheck()
或sensitivecheck.MsgCheckFilter()
函数,进行检测输入的内容是否包含敏感词。
- 你可以自由修改
sensitivecheck.go
中getSourceFileName()
和getCacheFileName()
的内容,自定义存储的路径位置。 - 由于不知道大家的项目使用的是什么
log
库,本项目统一使用fmt.Printf()
进行日志输出,如果你觉得不好用,全局替换成你项目里用的log即可。敏感词检查命中会有一行日志,也可根据自己需要进行保留或删除。 - 项目依赖
goframe
的gbinary
库,是在生成缓存文件时,将内存中的数据转成二进制时使用。你可以自己换成相同功能的库或者函数。
本项目使用字典前缀树算法实现。
使⽤TrieTree字典前缀树,将敏感词逐条遍历,构造⼀棵字典树。然后再将要检测的句⼦,遍历句⼦中 的每⼀个字,以这个字为开头到末尾,作为要检测的字符串,与字典树进⾏匹配。如找到字典树节点为敏感词结束节点,则命中敏感词。 参考:https://zhuanlan.zhihu.com/p/451564063
在进行敏感词检测时,有一些情况是比较特殊的。比如用户可能会为了输入科比
而输入科,比
,或是科.比
,但我们敏感词不可能穷举两个字之间的所有其他符号。
另外,用户可能会使用全角的SB来尝试逃离敏感词SB的匹配。而对于英文字母,有大写和小写,我们也不希望每个单词都配置大写版和小写版。
鉴于以上情况,本模块约定:
读取内容时,将输入中的标点符号都转成空格,将全角英文字母和数字转成半角,将大写字母都转成小写字母。
注意,有一种情况无法避免,那就是将数字作为汉字的分隔符,如
科8比
。这是因为用户输入的数字可能是有含义的,也可能是没有含义的。目前使用前缀树的方案无法检查每个数字是否是分隔数字。