浅谈Python敏感词过滤的实现

  

一个简单的实现
  

        类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敏感词过滤的实现