违禁词过滤

违禁词过滤完整设计与优化(前缀匹配、二分查找)

浪尽此生 提交于 2019-12-10 06:12:40
可能不止在天朝,绝大多数网站都会需要违禁词过滤模块,用于对不雅言论进行屏蔽;所以这个应该算是网站的基础功能。大概在去年的时候我开发过这个功能,当时用6600+(词数)的违禁词库,过滤2000+(字数)的文章,耗时大概20ms左右,当时自我感觉还挺良好。过了这一段时间,回想一下,其实有不少地方可以做优化、可以总结;于是从头到尾捋了一遍。 原始需求: 违禁词最原始的需求,也是最直观的,即是查找一篇未知的文档中,是否包含了一个指定词语集合(违禁词库)中的词语。其实要实现这个功能的思路有许多,也可以很简单;但为了达到一定的效率,需要一些算法和数据结构的设计。 逻辑整理: 将原始的需求转换成可实现的逻辑,这里根据思维方向(出发点),可以有两个不同的选择:1. 遍历文档的每个词,查看违禁词库中是否包含这个词; 2. 遍历违禁词库中的每个词, 查看文档中是否包含这个词。 我这里采用的是第一种思维方向,原因有二: a. 我要过滤的文档的字数,大部分集中的2000~5000之间,少于违禁词的个数;遍历少的从性能上讲,有先天的优势。 b. 待过滤的文档是未知的,且变化的,而违禁词已知且固定;于是我们可对违禁词的数据结构做一定的设计,加快一个词在其中的查找,所以需要遍历的是文档(较主要的一个原因)。 思路有了,简单概括为:从文档中取词—>该词是否属于违禁词。 下一步我们需要整理出实现逻辑的步骤