一个简单的实现
类NaiveFilter (): “从关键字过滤消息 非常简单的滤波器实现 在在在f=NaiveFilter () 在在在f.add(“性感”) 在在在f。过滤器(“你好性感宝贝”) 你好* * * *的婴儿 “‘ def __init__(自我): 自我。关键词=集([]) def解析(自我、路径): 为关键字在开放(路径): self.keywords.add (keyword.strip () .decode (utf - 8) .lower ()) def过滤器(自我、消息、repl=?”): 消息=str(消息).lower () 千瓦的self.keywords: 消息=消息。替换(千瓦,repl) 返回消息
其中带()函数删除附近的一些空格,解码采用utf - 8的形式,然后将其转为小写。
parse()函数就是打开文件,然后从中取各个关键词,然后将其存在关键词集合中。
过滤器()函数是一个过滤器函数,其中将消息转化为小写,然后将关键词替换成*。
类BSFilter: “从关键字过滤消息 使用重新排序映射来减少更换时间 在在在f=BSFilter () 在在在f.add(“性感”) 在在在f。过滤器(“你好性感宝贝”) 你好* * * *的婴儿 “‘ def __init__(自我): 自我。关键词=[] 自我。kwsets=集([]) 自我。bsdict=defaultdict(集) 自我。pat_en=re.compile (r ' ^ [0-9a-zA-Z] + $ ') #英语短语 def添加(自我,关键字): 如果不是isinstance(关键字,str): 关键词=keyword.decode (utf - 8) 关键词=keyword.lower () 如果关键字不在self.kwsets: self.keywords.append(关键字) self.kwsets.add(关键字) 指数=len (self.keywords) - 1 在keyword.split词(): 如果self.pat_en.search(词): 阀门self.bsdict[词](索引) 其他: 字符的字: self.bsdict (char)阀门(索引) def解析(自我、路径): 张开f(路径,“r”): 在f:关键字 self.add (keyword.strip ()) def过滤器(自我、消息、repl=?”): 如果不是isinstance(消息,str): 消息=message.decode (“utf - 8”) 消息=message.lower () 在message.split词(): 如果self.pat_en.search(词): 在self.bsdict指数[词]: 消息=message.replace(自我。关键词(指数)、repl) 其他: 字符的字: 在self.bsdict指数(char): 消息=message.replace(自我。关键词(指数)、repl) 返回消息
在上面的实现例子中,对于搜索查找进行了优化,对于英语单词,直接进行了按词索引字典查找。对于其他语言模式,我们采用逐字符查找匹配的一种模式。
BFS:宽度优先搜索方式。
类DFAFilter (): “从关键字过滤消息 经常使用DFA保持算法执行 在在在f=DFAFilter () 在在在f.add(“性感”) 在在在f。过滤器(“你好性感宝贝”) 你好* * * *的婴儿 “‘ def __init__(自我): 自我。keyword_chains={} self.delimit=' \ x00 ' def添加(自我,关键字): 如果不是isinstance(关键字,str): 关键词=keyword.decode (utf - 8) 关键词=keyword.lower () 识字课=keyword.strip () 如果不是识字课: 返回 水平=self.keyword_chains 因为我在范围(len(字符)): 如果字符[我]水平: 级别=[字符[我]] 其他: 如果不是isinstance(水平、dict类型): 打破 j的范围(我,len(字符)): 水平(字符[j]]={} last_level last_char=级别,字符[j] 级别=[识字课[j]] last_level [last_char]={self.delimit: 0} 打破 如果我==len(字符)- 1: 水平(self.delimit)=0 def解析(自我、路径): 张开(路径,编码=皍tf - 8”) f: 在f:关键字 self.add (keyword.strip ()) def过滤器(自我、消息、repl=?”): 如果不是isinstance(消息,str): 消息=message.decode (“utf - 8”) 消息=message.lower () ret=[]=0开始 虽然开始& lt;len(信息): 水平=self.keyword_chains step_ins=0 字符的消息[:]: 如果字符水平: step_ins +=1 如果self.delimit不在级别(char): 级别=(char) 其他: ret.append (repl * step_ins) +=step_ins - 1开始 打破 其他: ret.append(消息[开始]) 打破 其他: ret.append(消息[开始]) +=1开始 返回" . join (ret)浅谈Python敏感词过滤的实现