浅谈Python 敏感词过滤的实现
一个简单的实现
classNaiveFilter(): '''FilterMessagesfromkeywords verysimplefilterimplementation >>>f=NaiveFilter() >>>f.add("sexy") >>>f.filter("hellosexybaby") hello****baby ''' def__init__(self): self.keywords=set([]) defparse(self,path): forkeywordinopen(path): self.keywords.add(keyword.strip().decode('utf-8').lower()) deffilter(self,message,repl="*"): message=str(message).lower() forkwinself.keywords: message=message.replace(kw,repl) returnmessage
其中strip()函数删除附近的一些空格,解码采用utf-8的形式,然后将其转为小写。
parse()函数就是打开文件,然后从中取各个关键词,然后将其存在关键词集合中。
filter()函数是一个过滤器函数,其中将消息转化为小写,然后将关键词替换成*。、
classBSFilter: '''FilterMessagesfromkeywords UseBackSortedMappingtoreducereplacementtimes >>>f=BSFilter() >>>f.add("sexy") >>>f.filter("hellosexybaby") hello****baby ''' def__init__(self): self.keywords=[] self.kwsets=set([]) self.bsdict=defaultdict(set) self.pat_en=re.compile(r'^[0-9a-zA-Z]+$')#englishphraseornot defadd(self,keyword): ifnotisinstance(keyword,str): keyword=keyword.decode('utf-8') keyword=keyword.lower() ifkeywordnotinself.kwsets: self.keywords.append(keyword) self.kwsets.add(keyword) index=len(self.keywords)-1 forwordinkeyword.split(): ifself.pat_en.search(word): self.bsdict[word].add(index) else: forcharinword: self.bsdict[char].add(index) defparse(self,path): withopen(path,"r")asf: forkeywordinf: self.add(keyword.strip()) deffilter(self,message,repl="*"): ifnotisinstance(message,str): message=message.decode('utf-8') message=message.lower() forwordinmessage.split(): ifself.pat_en.search(word): forindexinself.bsdict[word]: message=message.replace(self.keywords[index],repl) else: forcharinword: forindexinself.bsdict[char]: message=message.replace(self.keywords[index],repl) returnmessage
在上面的实现例子中,对于搜索查找进行了优化,对于英语单词,直接进行了按词索引字典查找。对于其他语言模式,我们采用逐字符查找匹配的一种模式。
BFS:宽度优先搜索方式。
classDFAFilter(): '''FilterMessagesfromkeywords UseDFAtokeepalgorithmperformconstantly >>>f=DFAFilter() >>>f.add("sexy") >>>f.filter("hellosexybaby") hello****baby ''' def__init__(self): self.keyword_chains={} self.delimit='\x00' defadd(self,keyword): ifnotisinstance(keyword,str): keyword=keyword.decode('utf-8') keyword=keyword.lower() chars=keyword.strip() ifnotchars: return level=self.keyword_chains foriinrange(len(chars)): ifchars[i]inlevel: level=level[chars[i]] else: ifnotisinstance(level,dict): break forjinrange(i,len(chars)): level[chars[j]]={} last_level,last_char=level,chars[j] level=level[chars[j]] last_level[last_char]={self.delimit:0} break ifi==len(chars)-1: level[self.delimit]=0 defparse(self,path): withopen(path,encoding='UTF-8')asf: forkeywordinf: self.add(keyword.strip()) deffilter(self,message,repl="*"): ifnotisinstance(message,str): message=message.decode('utf-8') message=message.lower() ret=[] start=0 whilestartDFA即DeterministicFiniteAutomaton,也就是确定有穷自动机。
使用了嵌套的字典来实现。
参考
Github:敏感词过滤系统
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。