python 实现敏感词过滤的方法


Posted in Python onJanuary 21, 2019

如下所示:

#!/usr/bin/python2.6  
# -*- coding: utf-8 -*- 
import time 
class Node(object): 
  def __init__(self): 
    self.children = None 
 
# The encode of word is UTF-8 
def add_word(root,word): 
  node = root 
  for i in range(len(word)): 
    if node.children == None: 
      node.children = {} 
      node.children[word[i]] = Node() 
 
    elif word[i] not in node.children: 
      node.children[word[i]] = Node() 
 
    node = node.children[word[i]] 
 
def init(path): 
  root = Node() 
  fp = open(path,'r') 
  for line in fp: 
    line = line[0:-1] 
    #print len(line) 
    #print line 
    #print type(line) 
    add_word(root,line) 
  fp.close() 
  return root 
 
# The encode of word is UTF-8 
# The encode of message is UTF-8 
def is_contain(message, root): 
  for i in range(len(message)): 
    p = root 
    j = i 
    while (j<len(message) and p.children!=None and message[j] in p.children): 
      p = p.children[message[j]] 
      j = j + 1 
 
    if p.children==None: 
      #print '---word---',message[i:j] 
      return True 
   
  return False 
 
 
 
def dfa(): 
  print '----------------dfa-----------' 
  root = init('/tmp/word.txt') 
 
  message = '四处乱咬乱吠,吓得家中11岁的女儿躲在屋里不敢出来,直到辖区派出所民警赶到后,才将孩子从屋中救出。最后在征得主人同意后,民警和村民合力将这只发疯的狗打死' 
  #message = '不顾' 
  print '***message***',len(message) 
  start_time = time.time() 
  for i in range(1000): 
    res = is_contain(message,root) 
    #print res 
  end_time = time.time() 
  print (end_time - start_time)  
 
def is_contain2(message,word_list): 
  for item in word_list: 
    if message.find(item)!=-1: 
      return True 
  return False 
 
def normal(): 
  print '------------normal--------------' 
  path = '/tmp/word.txt' 
  fp = open(path,'r') 
  word_list = [] 
  message = '四处乱咬乱吠,吓得家中11岁的女儿躲在屋里不敢出来,直到辖区派出所民警赶到后,才将孩子从屋中救出。最后在征得主人同意后,民警和村民合力将这只发疯的狗打死' 
  print '***message***',len(message) 
  for line in fp: 
    line = line[0:-1] 
    word_list.append(line) 
  fp.close() 
  print 'The count of word:',len(word_list) 
  start_time = time.time() 
  for i in range(1000): 
    res = is_contain2(message,word_list) 
    #print res 
  end_time = time.time() 
  print (end_time - start_time)  
 
 
if __name__ == '__main__': 
  dfa() 
  normal()

测试结果:

1) 敏感词 100个

----------------dfa-----------
***message*** 224
0.325479984283
------------normal--------------
***message*** 224
The count of word: 100
0.107350111008

2) 敏感词 1000 个

----------------dfa-----------
***message*** 224
0.324251890182
------------normal--------------
***message*** 224
The count of word: 1000
1.05939006805

从上面的实验我们可以看出,在DFA 算法只有在敏感词较多的情况下,才有意义。在百来个敏感词的情况下,甚至不如普通算法

下面从理论上推导时间复杂度,为了方便分析,首先假定消息文本是等长的,长度为lenA;每个敏感词的长度相同,长度为lenB,敏感词的个数是m。

1) DFA算法的核心是构建一棵多叉树,由于我们已经假设,敏感词的长度相同,所以树的最大深度为lenB,那么我们可以说从消息文本的某个位置(字节)开始的某个子串是否在敏感词树中,最多只用经过lenB次匹配.也就是说判断一个消息文本中是否有敏感词的时间复杂度是lenA * lenB

2) 再来看看普通做法,是使用for循环,对每一个敏感词,依次在消息文本中进行查找,假定字符串是使用KMP算法,KMP算法的时间复杂度是O(lenA + lenB)

那么对m个敏感词查找的时间复杂度是 (lenA + lenB ) * m

综上所述,DFA 算法的时间复杂度基本上是与敏感词的个数无关的。

以上这篇python 实现敏感词过滤的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python中的cookielib模拟登录网站
Apr 09 Python
python使用in操作符时元组和数组的区别分析
May 19 Python
Python使用turtule画五角星的方法
Jul 09 Python
Python 中 Virtualenv 和 pip 的简单用法详解
Aug 18 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
使用pandas读取文件的实现
Jul 31 Python
关于django 1.10 CSRF验证失败的解决方法
Aug 31 Python
Python3实现二叉树的最大深度
Sep 30 Python
详解opencv中画圆circle函数和椭圆ellipse函数
Dec 27 Python
Python 实现集合Set的示例
Dec 21 Python
python执行精确的小数计算方法
Jan 21 #Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 #Python
python dict 相同key 合并value的实例
Jan 21 #Python
关于python之字典的嵌套,递归调用方法
Jan 21 #Python
对python 合并 累加两个dict的实例详解
Jan 21 #Python
python去重,一个由dict组成的list的去重示例
Jan 21 #Python
Python实现计算字符串中出现次数最多的字符示例
Jan 21 #Python
You might like
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
javascript简单判断输入内容是否合法的方法
2016/05/11 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
js实现3D图片展示效果
2017/03/09 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
Python去除字符串两端空格的方法
2015/05/21 Python
解析Python编程中的包结构
2015/10/25 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
python每天定时运行某程序代码
2019/08/16 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
端口镜像是怎么实现的
2014/03/25 面试题
个人对照检查剖析材料
2014/10/13 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
民事答辩状格式范文
2015/05/21 职场文书
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python