资源描述:
《敏感词过滤技术文档》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、敏感词过滤技术文档目录1.背景32.算法描述33.效率的瓶颈54.使用详解64.1publicstaticIList[]GetKeyWordArray(IListKeyWordList,boolIsIgnoreCase)64.2publicstaticIList[]GetKeyWordArray(string[]KeyWordList,boolIsIgnoreCase)64.3publicstringFilterSingleThread(stringContent,IList[]SensitiveArray,charRepl
2、aceChar,boolIsIgnoreCase)64.4publicstringFilterSingleThread(stringContent,IList[]SensitiveArray)74.5publicstringFilterMuliThread(stringContent,IList[]SensitiveArray,intThreadCount,charReplaceChar,boolIsIgnoreCase)74.6publicstringFilterMuliThread(stringContent,IList[]Sensit
3、iveArray,intThreadCount)74.7publicstringReplace(stringContent,IList[]KeyWordArray,stringLeftStr,stringRightStr,boolIsIgnoreCase)84.8publicstringReplace(stringContent,IList[]KeyWordArray,stringLeftStr,stringRightStr)85.一些细节86.其他91.背景在天朝,很多东西都要被过滤。鉴于各大网站论坛博客等都有敏感词过滤,**网站的社区部分当然也要作相应
4、处理。2.算法描述首先要根据关键词表的首字符建立索引(将char转成int型)。IList[]arr=newList[65535];因为Unicode码最大是65535个,所以建立一个65535大小的数组,相同首字符的关键词放入string的泛型集合中。注意:关键词表最好是预先根据长度降序排好序的。比如,“法O功”和“法O功组织”都是关键字,需要过滤的文本内容为“今天法O功组织集合”,如果前者比后者先执行过滤的话,过滤后就变成“今天***组织集合”,但理想情况是“今天*****集合”,所以要把长的关键词放前面。接着逐个读取目标字符串的字符,转成int型后判
5、断索引数组中是否有值,为空则将该字符添加到结果集中(一个StringBuilder);不为空则循环该首字符开头的关键词,逐个字符比较,有匹配的则以等长的特殊字符代替(默认是*号)。模拟步骤如下:关键词表为:“法O功组织”,“法O功”,“李洪志”字符“法”转成int为27861字符“李”转成int为26446因此索引数组的下标27861的值为长度2的泛型集合,下标26446的值为长度1的泛型集合,其余都为空。目标字符串为“今天法O功组织集合,李洪志发表李洪”1逐个字符读取,“今”和“天”相应的索引数组的值为空,将它们放入结果集中。(红色字符表示当前下标读取的字符)目标:今天法O功组织集合,
6、李洪志发表李洪结果:今天2“法“对应的索引数组值不为空,则循环该泛型集合,逐个字符比对目标:今天法O功组织集合,李洪志发表李洪泛型集合:法O功组织完全匹配,则结果集中放入5个*号。结果:今天*****3“集”“合”“,”对应的索引数组值都为空,将它们放入结果集中。目标:今天法O功组织集合,李洪志发表李洪结果:今天*****集合,4“李“对应的索引数组值不为空,则循环该泛型集合,逐个字符比对目标:今天法O功组织集合,李洪志发表李洪泛型集合:李洪志完全匹配,则结果集中放入3个*号。结果:今天*****集合,***5“发”“表”对应的索引数组值都为空,将它们放入结果集中。目标:今天法O功组织集
7、合,李洪志发表李洪结果:今天*****集合,***发表6“李“对应的索引数组值不为空,则循环该泛型集合,逐个字符比对目标:今天法O功组织集合,李洪志发表李洪泛型集合:李洪志不匹配,将“李“放入结果集中。结果:今天*****集合,***发表李7“洪”对应的索引数组值都为空,将它放入结果集中。目标:今天法O功组织集合,李洪志发表李洪(读到末尾)结果:今天*****集合,***发表李洪最后过滤结果就是:“今天*****集合,***发表李洪