安全開發第二講-如何實現敏感詞組的快速匹配

安全開發第二講-如何實現敏感詞組的快速匹配

敏感詞詞組的例子模式

今天&早上&喫飯

詞組模式可以將句子匹配詞組化,從而減少純句子匹配帶來的漏報

設待檢測文本的大小爲分詞之後存在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樹
和上面一樣,詞組需要進行

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