浅谈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 30 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
Jul 04 Python
python中异常报错处理方法汇总
Nov 20 Python
Python中的字符串操作和编码Unicode详解
Jan 18 Python
selenium+python实现自动登录脚本
Apr 22 Python
python学生管理系统开发
Jan 30 Python
Django实现微信小程序的登录验证功能并维护登录态
Jul 04 Python
pandas 层次化索引的实现方法
Jul 06 Python
python pandas.DataFrame.loc函数使用详解
Mar 26 Python
opencv 查找连通区域 最大面积实例
Jun 04 Python
你需要学会的8个Python列表技巧
Jun 24 Python
Python 合并拼接字符串的方法
Jul 28 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
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
php读取xml实例代码
2010/01/28 PHP
解析PHP提交后跳转
2013/06/23 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
2020/05/02 PHP
Javascript Object.extend
2010/05/18 Javascript
js 中的switch表达式使用示例
2020/06/03 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
Vue2单一事件管理组件通信
2017/05/09 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
python实现网站用户名密码自动登录功能
2019/08/09 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
教师年终个人自我评价
2013/10/04 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
英语通知范文
2015/04/22 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
导游词之无锡唐城
2019/12/12 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
python index() 与 rindex() 方法的使用示例详解
2022/12/24 Python