目前网络言论环境相当自由,键盘侠层出不穷,拿起键盘一梭子就是问候祖宗十八代的现象屡见不鲜,这就需要应用有能力对这些低俗敏感词进行过滤,以营造绿色的网络环境,虽然“***”大家都心知肚明,但是表面功夫还是要做的,起码不能让家长发现我们的应用过于低俗。下面我们谈谈这个业务系统的设计和相关知识点。
1、敏感字词过滤系统的基本要素:敏感字字典、敏感词匹配算法、脱敏处理
2、敏感词过滤算法的设计
1)基于正向匹配:基于正向匹配会对字符串进行遍历操作,在字符串寻找满足敏感字典匹配的最长或者最短子串。这个脱离了句子的语义,可能会误判,但不会遗漏。
2)基于分词:基于分词的算法会先将输入文本进行分词处理,然后再查看分词的列表中是否包含敏感词,这种算法依赖于分词算法的可靠性,分词库参见https://www.cnblogs.com/lishanyang/p/6017155.html,这位老哥总结的挺多个,我觉得分词准确率比较高的是word。
3、敏感词匹配算法
1)KMP算法
2)DFA状态机
3)字典树
4)Bloom过滤器(适用于分词)。可以使用Guava、Redis、Spark等提供的Bloom过滤器。
5)搜索引擎:Sphinx、Elastic、Solr
4、扩展
1)过滤系统的严格等级设计
正常 – 根据字词进行匹配,比如敏感词“尼玛”只匹配“尼玛”。
严格 – 根据拼音和发音进行匹配,比如敏感词“尼玛”匹配“尼玛”也可以匹配“泥马”。
非常严格 – 根据拼音进行匹配,比如敏感词“尼玛”匹配“尼玛”也可以匹配“泥马”,也可以匹配“你骂”。
这种设计需要拼音注音库的支持,比如Pinyin4j。
设计通用匹配接口需要考虑:
1、如何设计TextMatcher使其能同时匹配分词和正向匹配两种MatchText?
2、注音操作如何匹配?现在的解决方案是将字典的所有单词翻译成拼音,在匹配时将输入字符串翻译成拼音,比较两者。
github代码:https://github.com/delin10/business