鄧立波 深圳,2007-10
作者****
:email:
msn:
演算法設計
要求:已有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 函式後,系統先給新的程序分...