浅谈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 相关文章推荐
Python3基础之list列表实例解析
Aug 13 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 Python
Python冒泡排序注意要点实例详解
Sep 09 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
Jul 06 Python
python用opencv批量截取图像指定区域的方法
Jan 24 Python
Python数组拼接np.concatenate实现过程
Apr 18 Python
Python ADF 单位根检验 如何查看结果的实现
Jun 03 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
使用Keras构造简单的CNN网络实例
Jun 29 Python
详解Anaconda 的安装教程
Sep 23 Python
Python getsizeof()和getsize()区分详解
Nov 20 Python
python异步的ASGI与Fast Api实现
Jul 16 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调用JAVA的WebService简单实例
2014/03/11 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
jQuery学习笔记之DOM对象和jQuery对象
2010/12/22 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
使用控制台破解百小度一个月只准改一次名字
2015/08/13 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
浅析JSONP技术原理及实现
2016/06/08 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
2018/12/05 jQuery
基于vue.js实现分页查询功能
2018/12/29 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
浅谈Python中的闭包
2015/07/08 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
Python 爬取携程所有机票的实例代码
2018/06/11 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
白莲教口号
2014/06/18 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
心术观后感
2015/06/11 职场文书
php去除数组中为0的元素的实例分析
2021/11/17 PHP
python 管理系统实现mysql交互的示例代码
2021/12/06 Python