浅谈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 类与元类的深度挖掘 I【经验】
May 06 Python
Python中的字符串查找操作方法总结
Jun 27 Python
tensorflow实现KNN识别MNIST
Mar 12 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
对python中list的拷贝与numpy的array的拷贝详解
Jan 29 Python
解决python Markdown模块乱码的问题
Feb 14 Python
彻底理解Python中的yield关键字
Apr 01 Python
Python中Numpy ndarray的使用详解
May 24 Python
django xadmin action兼容自定义model权限教程
Mar 30 Python
Django日志及中间件模块应用案例
Sep 10 Python
详解python 条件语句和while循环的实例代码
Dec 28 Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 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添加Xdebug扩展的方法
2014/02/12 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
jquery延迟对象解析
2016/10/26 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
微信小程序 实现动态显示和隐藏某个控件
2017/04/27 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
jquery实现简易验证插件封装
2020/09/13 jQuery
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
django settings.py 配置文件及介绍
2019/07/15 Python
python openpyxl使用方法详解
2019/07/18 Python
python Django编写接口并用Jmeter测试的方法
2019/07/31 Python
pytorch的batch normalize使用详解
2020/01/15 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
西班牙最好的在线购买葡萄酒的商店:Vinoseleccion
2019/10/30 全球购物
PHP如何与mysql建立链接
2013/05/05 面试题
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
为什么UNION ALL比UNION快
2016/03/17 面试题
办公文员的工作岗位职责
2013/11/12 职场文书
弄虚作假心得体会
2014/09/10 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
活动简报范文
2015/07/22 职场文书
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers
python pygame 开发五子棋双人对弈
2022/05/02 Python
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android