浅谈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自动安装pip
Apr 24 Python
在MAC上搭建python数据分析开发环境
Jan 26 Python
python登录并爬取淘宝信息代码示例
Dec 09 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
python 字典中取值的两种方法小结
Aug 02 Python
详解Django 时间与时区设置问题
Jul 23 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
Python Django实现layui风格+django分页功能的例子
Aug 29 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
解决django接口无法通过ip进行访问的问题
Mar 27 Python
Pytorch 中net.train 和 net.eval的使用说明
May 22 Python
对Keras自带Loss Function的深入研究
May 25 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下对字符串的递增运算代码
2010/08/21 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
php使浏览器直接下载pdf文件的方法
2013/11/15 PHP
PHP简单获取视频预览图的方法
2015/03/12 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
js的with语句使用方法
2007/09/21 Javascript
Javascript 陷阱 window全局对象
2008/11/26 Javascript
js Dialog 实践分享
2012/10/22 Javascript
jquery foreach使用示例
2013/09/12 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
15款jQuery分布引导插件分享
2015/02/04 Javascript
jQuery实现表格展开与折叠的方法
2015/05/04 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
JavaScript实现给定时间相加天数的方法
2016/01/25 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
微信小程序实现canvas分享朋友圈海报
2020/06/21 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
在Python中编写数据库模块的教程
2015/04/29 Python
Python图形绘制操作之正弦曲线实现方法分析
2017/12/25 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
Django ImageFiled上传照片并显示的方法
2019/07/28 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
Python中Selenium模块的使用详解
2020/10/09 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
完美解决IE8下不兼容rgba()的问题
2017/03/31 HTML / CSS
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
联强国际笔试题面试题
2013/07/10 面试题
大学新生军训个人的自我评价
2013/10/03 职场文书
通息工程毕业生自荐信
2013/10/16 职场文书
经济学博士求职自荐信范文
2013/11/23 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
学习两会精神心得范文
2014/03/17 职场文书
运动会主持人开幕词
2016/03/04 职场文书