道關於敏感詞過濾演算法的面試題

2021-05-09 17:59:41 字數 1098 閱讀 3133

鄧立波 深圳,2007-10

作者****

:email:

[email protected]

msn:

[email protected]

演算法設計

要求:已有1-1000敏感詞,對帖子進行過濾,不考慮分詞,要求演算法盡可能快。

基本思路:

首先對敏感詞按字元數目分為兩個組,一組只包含乙個字元,另一組至少包含兩個字元。

第一組敏感詞按僅有的乙個字元的unicode碼(16位整數)生成乙個hash表a。

第二組取敏感詞的首部兩個字元的unicode碼合成乙個32位整數,即取第乙個字元unicode碼為低16位,第二個為高16位,然後生成乙個hash表b,hash表內每個節點指向乙個由首部兩字元相同的敏感詞組成的詞彙表。

然後對帖子進行逐字分析,首先取兩個字元組成乙個32位整數,檢視是否在b表存在該節點,若存在,則繼續在節點指向的詞彙表中繼續查詢,如果在相應詞彙表中未找到或者b表中不存在該節點,這時再在a表中繼續查詢。

細節考慮:

1 考慮cpu高速緩衝器的效果,建議b表節點指向的詞彙表最好按平面形式儲存,便於順序掃瞄,不要採用鍊錶

結構。例如可考慮下面結構,詞彙以『/0』分隔,兩個『/0』表示詞彙表結束。 民

主 制/0 民

主 /0

/0

當詞彙表中詞彙比較多的時候,可考慮以樹表方式儲存詞彙表,以最大程度提高查詢速度。

2 對於hash表a,可以建乙個含65535個位元組(unicode編碼最多包含64435個字元)的陣列,如果該

字元為敏感字,則相應位元組值為1,否則為0,查詢時直接作陣列下標對映即可。

3 詞彙表中敏感詞應該按字元數目從多到少排列,以便盡可能匹配完整的敏感詞。

4 對每個字元做乙個hash仍然消耗比較大,絕大部分情況下,敏感詞的數量遠遠少於帖子中的詞彙量,因此應該盡

量減少hash次數,這同樣可以通過建乙個包含65535個位元組的陣列來實現,如果乙個字元在敏感詞的第乙個字

符中存在,則對應元素值為1,否則為0。這樣當在進行逐字分析時,如果字元在這個陣列中的對映值為0,就

不必進行hash運算了。

簡易的DFS演算法敏感詞過濾方法

public class sensitivewordinit 將敏感詞庫加入到hashmap中 addsensitivewordtohashmap keywordset catch exception e return sensitivewordmap 封裝敏感詞庫 param keywordset...

關於敏感詞過濾的一點想法

對濾詞表中的每個單詞做一次hash,以hash雜湊值作為key,單詞內容作為value 2.1起始符表 將濾詞表中每個單詞的起始字元構建成乙個表,作為起始符表 startlist 2.2結束符表 將濾詞表中每個單詞的結束字元構建成乙個表,作為結束符表 endlist 1.1 如果匹配到起始字元,搜尋...

一道關於fork()的面試題

昨天師兄乙個朋友找外企工作,幫他做程式設計題,其中一道比較有意思,如下 問輸出什麼?為什麼?include include int main 這道題感覺很有意思,算是知識的綜合。考慮清楚了,卻挺簡單 1.fork 的理解 fork 是乙個程序建立函式,乙個程序呼叫fork 函式後,系統先給新的程序分...