浅谈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更新列表的方法
Jul 28 Python
利用Python中unittest实现简单的单元测试实例详解
Jan 09 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
Sep 20 Python
Python入门之三角函数atan2()函数详解
Nov 08 Python
Python元组及文件核心对象类型详解
Feb 11 Python
python pandas中对Series数据进行轴向连接的实例
Jun 08 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
Jul 22 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
django框架auth模块用法实例详解
Dec 10 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
Python 文件数据读写的具体实现
Jan 24 Python
浅谈Python中的模块
Jun 10 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命名空间(Namespace)简明教程
2014/06/11 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
2013/04/02 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
2016/12/21 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
微信小程序 动画的简单实例
2017/10/12 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
python递归打印某个目录的内容(实例讲解)
2017/08/30 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
python读取hdfs并返回dataframe教程
2020/06/05 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
自我评价优秀范文分享
2013/11/30 职场文书
英语国培研修感言
2014/02/13 职场文书
售后服务经理岗位职责范本
2014/02/22 职场文书
区级文明单位申报材料
2014/05/15 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers