浅谈Python 敏感词过滤的实现


Posted in Python onAugust 15, 2019

一个简单的实现

class NaiveFilter():

  '''Filter Messages from keywords

  very simple filter implementation

  >>> f = NaiveFilter()
  >>> f.add("sexy")
  >>> f.filter("hello sexy baby")
  hello **** baby
  '''

  def __init__(self):
    self.keywords = set([])

  def parse(self, path):
    for keyword in open(path):
      self.keywords.add(keyword.strip().decode('utf-8').lower())

  def filter(self, message, repl="*"):
    message = str(message).lower()
    for kw in self.keywords:
      message = message.replace(kw, repl)
    return message

其中strip() 函数 删除附近的一些空格,解码采用utf-8的形式,然后将其转为小写。

parse()函数就是打开文件,然后从中取各个关键词,然后将其存在关键词集合中。

filter()函数是一个过滤器函数,其中将消息转化为小写,然后将关键词替换成*。、

class BSFilter:

  '''Filter Messages from keywords

  Use Back Sorted Mapping to reduce replacement times

  >>> f = BSFilter()
  >>> f.add("sexy")
  >>> f.filter("hello sexy baby")
  hello **** baby
  '''

  def __init__(self):
    self.keywords = []
    self.kwsets = set([])
    self.bsdict = defaultdict(set)
    self.pat_en = re.compile(r'^[0-9a-zA-Z]+$') # english phrase or not

  def add(self, keyword):
    if not isinstance(keyword, str):
      keyword = keyword.decode('utf-8')
    keyword = keyword.lower()
    if keyword not in self.kwsets:
      self.keywords.append(keyword)
      self.kwsets.add(keyword)
      index = len(self.keywords) - 1
      for word in keyword.split():
        if self.pat_en.search(word):
          self.bsdict[word].add(index)
        else:
          for char in word:
            self.bsdict[char].add(index)

  def parse(self, path):
    with open(path, "r") as f:
      for keyword in f:
        self.add(keyword.strip())

  def filter(self, message, repl="*"):
    if not isinstance(message, str):
      message = message.decode('utf-8')
    message = message.lower()
    for word in message.split():
      if self.pat_en.search(word):
        for index in self.bsdict[word]:
          message = message.replace(self.keywords[index], repl)
      else:
        for char in word:
          for index in self.bsdict[char]:
            message = message.replace(self.keywords[index], repl)
    return message

在上面的实现例子中,对于搜索查找进行了优化,对于英语单词,直接进行了按词索引字典查找。对于其他语言模式,我们采用逐字符查找匹配的一种模式。

BFS:宽度优先搜索方式。

class DFAFilter():

  '''Filter Messages from keywords

  Use DFA to keep algorithm perform constantly

  >>> f = DFAFilter()
  >>> f.add("sexy")
  >>> f.filter("hello sexy baby")
  hello **** baby
  '''

  def __init__(self):
    self.keyword_chains = {}
    self.delimit = '\x00'

  def add(self, keyword):
    if not isinstance(keyword, str):
      keyword = keyword.decode('utf-8')
    keyword = keyword.lower()
    chars = keyword.strip()
    if not chars:
      return
    level = self.keyword_chains
    for i in range(len(chars)):
      if chars[i] in level:
        level = level[chars[i]]
      else:
        if not isinstance(level, dict):
          break
        for j in range(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
    if i == len(chars) - 1:
      level[self.delimit] = 0

  def parse(self, path):
    with open(path,encoding='UTF-8') as f:
      for keyword in f:
        self.add(keyword.strip())

  def filter(self, message, repl="*"):
    if not isinstance(message, str):
      message = message.decode('utf-8')
    message = message.lower()
    ret = []
    start = 0
    while start < len(message):
      level = self.keyword_chains
      step_ins = 0
      for char in message[start:]:
        if char in level:
          step_ins += 1
          if self.delimit not in level[char]:
            level = level[char]
          else:
            ret.append(repl * step_ins)
            start += step_ins - 1
            break
        else:
          ret.append(message[start])
          break
      else:
        ret.append(message[start])
      start += 1

    return ''.join(ret)

DFA即Deterministic Finite Automaton,也就是确定有穷自动机。

使用了嵌套的字典来实现。

参考

Github:敏感词过滤系统

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python格式化字符串实例总结
Sep 28 Python
python 实现一个贴吧图片爬虫的示例
Oct 12 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
python实现图像拼接
Mar 05 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
Python如何对XML 解析
Jun 28 Python
python递归函数用法详解
Oct 26 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
Dec 08 Python
Python+DeOldify实现老照片上色功能
Jun 21 Python
pycharm创建scrapy项目教程及遇到的坑解析
Aug 15 #Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
Aug 15 #Python
Python依赖包整体迁移方法详解
Aug 15 #Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 #Python
python 修改本地网络配置的方法
Aug 14 #Python
python django 原生sql 获取数据的例子
Aug 14 #Python
django 连接数据库 sqlite的例子
Aug 14 #Python
You might like
PHP用户指南-cookies部分
2006/10/09 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
php发送post请求的三种方法
2014/02/11 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
什么是JavaScript
2009/08/13 Javascript
jquery 选择器部分整理
2009/10/28 Javascript
JavaScript 学习笔记(四)
2009/12/31 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
JavaScript 原型继承之构造函数继承
2011/08/26 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
解决JQeury显示内容没有边距内容紧挨着浏览器边线
2013/12/20 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
js实现敏感词过滤算法及实现逻辑
2018/07/24 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
浅谈dataframe中更改列属性的方法
2018/07/10 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
python statsmodel的使用
2020/12/21 Python
python中pdb模块实例用法
2021/01/15 Python
医院搬迁方案
2014/06/14 职场文书
法语专业求职信
2014/07/20 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
四风个人对照检查材料思想汇报
2014/09/25 职场文书
个人委托书如何写
2014/09/25 职场文书
创业计划书之密室逃脱
2019/11/08 职场文书
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android