ainatipen 发表于 2021-4-9 08:18

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

说明


参考自: 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,看上去非常强大。

水平有限,欢迎批评和建议。
页: [1]
查看完整版本: Unity/C# FastCheck方式敏感词过滤 及单元测试