道关于敏感词过滤算法的面试题

 

邓立波 深圳,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运算了。

你可能感兴趣的:(道关于敏感词过滤算法的面试题)