浅谈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设计模式之观察者模式实例
Apr 26 Python
Python魔术方法详解
Feb 14 Python
浅析Python中的多重继承
Apr 28 Python
Python中的fileinput模块的简单实用示例
Jul 09 Python
Python聚类算法之DBSACN实例分析
Nov 20 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
详解python tkinter教程-事件绑定
Mar 28 Python
Python 通过打码平台实现验证码的实现
May 13 Python
Python 3.8新特征之asyncio REPL
May 28 Python
pycharm访问mysql数据库的方法步骤
Jun 18 Python
python实现广度优先搜索过程解析
Oct 19 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
Apr 19 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实现HTML生成PDF文件的方法
2014/11/07 PHP
php的sso单点登录实现方法
2015/01/08 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
判断是否安装flash player及当前版本的JS代码
2013/08/08 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
ajax异步请求详解
2017/01/06 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
Vue渲染过程浅析
2019/03/14 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
详解django+django-celery+celery的整合实战
2019/03/19 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
2019/04/15 Python
pyqt5 从本地选择图片 并显示在label上的实例
2019/06/13 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
类的核心特性有哪些
2014/01/01 面试题
职业生涯规划怎么写
2013/12/29 职场文书
英语感恩演讲稿
2014/01/14 职场文书
银行委托书范本
2014/04/04 职场文书
护理专业毕业生自荐信
2014/06/15 职场文书
英语专业求职信
2014/07/08 职场文书
流动人口婚育证明
2014/10/19 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
Pandas数据类型之category的用法
2021/06/28 Python