邓立波 深圳,2007-10
作者联系方式:
email: libodeng@gmail.com
msn: libodeng@gmail.com
算法设计
要求:已有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运算了。