问题背景:有一个用户留言板,留言在100字内,另外有一个滤词表,现在需要对用户留言进行过滤,清楚留言中出现并且出现在滤词表中的单词

针对留言长度相对于滤词表单词而言较短,可采用如下滤词法

 

1.构建滤词表的HashMap(filterMap)

对滤词表中的每个单词做一次Hash,以Hash散列值作为Key,单词内容作为Value

 

2.构建滤词表单词的起始符表和结束符表

2.1起始符表

将滤词表中每个单词的起始字符构建成一个表,作为起始符表(startList)

2.2结束符表

将滤词表中每个单词的结束字符构建成一个表,作为结束符表(endList)

 

3.搜索留言敏感词

1)从留言第一个字开始,与startList中的字符匹配

1.1)如果匹配到起始字符,搜索ai的下一个字符ai+1,查看ai+1是否存在endList

1.1.1)如果匹配到则截取留言a1到ai+1的n个字符,并在filterMap中查找这n个字符hash值

1.1.1.1)如果filterMap中查找到了这n个字符,则清除或记录敏感词后从ai+2继续重复1)

1.1.1.2)如果filterMap没有查找到这n个字符,则从ai+1个字符开始重复1)

1.1.2)如果ai+1不存在于endList,则从ai+2开始重复1.1)

1.2)如果没有匹配到起始字符,则继续往后搜索,在startList中查找留言中的ai+1,重复1),直到留言所有字符搜索完成

 

例子:

留言"fuckfucok"

滤词表"fuck" "damn"

滤词表单词最大长度maxLenth = 4;

filterMap(假设hash值如下)

"1" => "fuck"

"2" => "damn"

 

startList {"f", "d"}

endList{"k", "n"}

 

首先查找"fuckfucok"的第一个字符f

在startList中找到了f,然后查找u,不存在于endList,再查找c,不存在于endList,再查找k,存在于endList,就可以对fuck进行hash然后在filterMap中匹配了,匹配到后清除fuck,然后从k的下一个字符f再次开始匹配,发现f在startList中,重复上述操作,找到最后一个字符k,发现长度已经超过maxLenth,匹配结束

最后滤词结果****fucok;

posted on 2012-05-09 17:31  ZimZz  阅读(1240)  评论(0编辑  收藏  举报