找回密码
 立即注册
查看: 667|回复: 0

Unity/C# FastCheck方式敏感词过滤 及单元测试

[复制链接]
发表于 2021-4-9 08:18 | 显示全部楼层 |阅读模式
说明


参考自: NewbieGameCoder/IllegalWordsDetection: 提供高效率的较简单的Unity3d手游客户端的敏感词检测的算法,能应付大部分敏感词过滤需求 (github.com)
我的实现:https://github.com/Csymaet/IllegalWordsDetection
使用了FastCheck的过滤方式,思路非常巧妙,效率也比较高。
原项目使用了指针,因为对指针不熟,所以我不用指针重构了一遍
    代码变动较大逻辑做了些优化,但大体思路是一致的可读性更好一点而且写了单元测试

效率上比原项目快点(这让我怀疑我写得是不是有bug, 我没用指针居然更快一点???)
核心


遍历要检测的字符串,而不是遍历屏蔽字,屏蔽字可能有成千上万个,而要检测的字符串通常最多只有几十个字。
思路
变量声明:
text: 要检测的字符串
badWord: 敏感词
curChar: 遍历text时,当前遍历到的字符
curCharIndex: 当前遍历到的字符索引
检测是否存在badWords
    先把text转换成小写,然后去掉里面没有意义的字符,如"!@#$"。从前往后,遍历text的每一个字符,直到有一个字符是某个badWord的首字符为止。此时curChar是某个badWord的首字符,那就继续检测下一个字符是不是某个badWord的第二个字符,以此类推。如果第curCharIndex+i个字符是某个badWord的第i+1个字符,同时也是某个badWord的尾字符,就从curCharIndex截取到curCharIndex+i,看看它是不是badWord,如果是,则说明存在badWord。

将字符串中的敏感词替换为*号的思路和上面说的大同小异,只是遇到敏感词时不返回,而是将位置记录下来,不再赘述。
结果


过滤这样一段话1000次,敏感词为5000个,大概花费50毫秒左右


过滤结果.png

单元测试(写单元测试还是很有用的!帮我发现了一些问题)


单元测试.png

有兴趣的还可以看下这个项目ToolGood.Words,看上去非常强大。
水平有限,欢迎批评和建议。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-15 08:33 , Processed in 0.194675 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表