浅谈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
whilestart
DFA即DeterministicFiniteAutomaton,也就是确定有穷自动机。
使用了嵌套的字典来实现。
参考
Github:敏感词过滤系统
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。