在上一篇中,完成了首页的“问题列表”,经过测试,数据和页面都没有问题。然而这里有一个不容忽视的问题,那就是实际生产环境中“问题”将是由用户发出来的,UGC 可不会按照规矩来,这些文本中的坑,懂的都懂……最经典的问题就是 HTML 注入和敏感词,两者都会使社区的用户体验大大降低,前者还可能会造成数据安全问题,后者则可能涉及到法律问题,因此文本过滤是无论如何都非常有必要做的。
敏感词过滤
思考一下,需要被过滤的关键词数量是比较多的,而且其中的一些关键词比较相似。如果要到目标文本中一个个找关键词,必然需要多次遍历长文本,效率非常低,因此比较理想的做法是把关键词构建成一个树,只遍历文本一次就完成查找的任务。
字典树又称为单词查找树、前缀树,典型应用于统计、排序和保存大量的字符串,但不仅限于字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点在于,利用字符串的公共前缀来减少查询时间,最大程度减少无谓的字符串比较,查询效率比哈希树高。看完这段百度百科对字典树的介绍,不难发现它是比较适合用于本场景下的敏感词检索的。
字典树
字典树是一种树形结构,它的基本性质为:
- 根节点不包含字符,除根节点外每一个节点都只包含一个字符;
- 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
- 每个节点的所有子节点包含的字符都不相同。