浅谈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编程中包的概念与管理
Oct 16 Python
Python字符串特性及常用字符串方法的简单笔记
Jan 04 Python
Python向日志输出中添加上下文信息
May 24 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
Aug 22 Python
对python中Librosa的mfcc步骤详解
Jan 09 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
django创建超级用户过程解析
Sep 18 Python
Python 实现顺序高斯消元法示例
Dec 09 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
Python Pillow(PIL)库的用法详解
Sep 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 adodb连接mssql解决乱码问题
2009/06/12 PHP
php懒人函数 自动添加数据
2011/06/28 PHP
PHP rawurlencode与urlencode函数的深入分析
2013/06/08 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
js树形控件脚本代码
2008/07/24 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
js下拉框二级关联菜单效果代码具体实现
2013/08/03 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
jquery 提示信息显示后自动消失的具体实现
2013/12/18 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
python 异常处理总结
2016/10/18 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
Python实现简单查找最长子串功能示例
2019/02/26 Python
Python/Django后端使用PIL Image生成头像缩略图
2019/04/30 Python
centos 安装Python3 及对应的pip教程详解
2019/06/28 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
python常用运维脚本实例小结
2020/02/14 Python
Vans澳大利亚官网:购买鞋子、服装及配件
2019/09/05 全球购物
作风大整顿心得体会
2014/09/10 职场文书
歌颂党的演讲稿
2014/09/10 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript