浅谈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将xml和xsl转换为html的方法
Mar 10 Python
python获取远程图片大小和尺寸的方法
Mar 26 Python
Python学习小技巧之列表项的拼接
May 20 Python
Python基于递归算法实现的走迷宫问题
Aug 04 Python
python安装教程
Feb 28 Python
python实现list由于numpy array的转换
Apr 04 Python
Django 接收Post请求数据,并保存到数据库的实现方法
Jul 12 Python
Python字典中的值为列表或字典的构造实例
Dec 16 Python
pytorch快速搭建神经网络_Sequential操作
Jun 17 Python
简单了解python关键字global nonlocal区别
Sep 21 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
Django restful framework生成API文档过程详解
Nov 12 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自定义session示例分享
2014/04/22 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
购物车实现的几种方式优缺点对比
2018/05/02 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
JS 两个字符串时间的天数差计算
2013/08/25 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
2015/11/30 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
2017/03/08 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
2018/07/09 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
详解Python中的Descriptor描述符类
2016/06/14 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
python实现同一局域网下传输图片
2020/03/20 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
C语言编程练习
2012/04/02 面试题
应用化学专业职业生涯规划书
2013/12/31 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
医学求职信
2014/05/28 职场文书
医院党建工作总结2015
2015/05/26 职场文书
小学六一主持词开场白
2015/05/28 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers