安全开发第二讲-如何实现敏感词组的快速匹配

安全开发第二讲-如何实现敏感词组的快速匹配

敏感词词组的例子模式

今天&早上&吃饭

词组模式可以将句子匹配词组化,从而减少纯句子匹配带来的漏报

设待检测文本的大小为分词之后存在500个词语

假如你手上有百万级的检测词组库,你能想到哪些方案快速检测(1秒内响应)?

1、set集合
首先我们来想一想集合是否可行,首先我们可以将词组通过&拆分,然后形成词语,每个词组是由多个词语构成的

AA&BB&CC => AA BB CC

拆分之后的词语对象应该至少包含两个属性:词语名+词语所在的词组id列表,这样的对应关系需要额外的结构来存储。然后百万级的词库将产生百万级的对象(有多少个词就会产生多少个这样的对象),然后我们把这些词语全部存储到一个set集合中。我们知道,在Java8中,HashSet是基于HashMap实现的,而HashMap是基于链表+红黑树实现的,初始时,HashMap内部是链表的结构,当达到一定阈值的时候,就会转成红黑树来存储节点。同时,HashMap为了减少碰撞率,需要通过荷载因子进行扩容(即达到多少的荷载就进行一次扩容),当HashMap中存储的节点越多,扩容带来的影响就越大。在我们的场景中,如果让一个HashMap去存储百万级的对象,暂且不考虑是否会出现OOM或者栈溢出。光是每次扩容带来的影响就很头大了。

集合的平均查找时间复杂度是O(Logn),对于百万级,也就是说一个词语需要查询6-7次,然后再从词语名->词语所在的词组id列表的对应关系中取出(一般使用hashMap存储),也需要6-7次查询。也就是说,一个词语需要12-14次左右的查询。一篇文章大约一共需要12*500=6000次匹配,存储方面需要使用HashSet存储词,用HashMap存储词语和其所在id列表对应关系。

看起来这样的结果却是还是可以令人接受的,那么你还可以提出别的方法吗?

2、Trie树
和上面一样,词组需要进行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章