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实现系统状态监测和故障转移实例方法
Nov 18 Python
Python获取任意xml节点值的方法
May 05 Python
python使用fcntl模块实现程序加锁功能示例
Jun 23 Python
利用python求相邻数的方法示例
Aug 18 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
用Python写脚本,实现完全备份和增量备份的示例
Apr 29 Python
python判断列表的连续数字范围并分块的方法
Nov 16 Python
python 用所有标点符号分隔句子的示例
Jul 15 Python
对Python生成器、装饰器、递归的使用详解
Jul 19 Python
wxPython实现画图板
Aug 27 Python
基于numpy中的expand_dims函数用法
Dec 18 Python
Python常遇到的错误和异常
Nov 02 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网页后退不再出现过期
2007/03/08 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
php session_decode函数用法讲解
2019/05/26 PHP
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
2010/08/24 Javascript
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
用jquery存取照片的具体实现方法
2013/06/30 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
js图片处理示例代码
2014/05/12 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
微信小程序自定义导航栏(模板化)
2019/11/15 Javascript
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
详解Python的Django框架中的模版继承
2015/07/16 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
Python实现随机创建电话号码的方法示例
2018/12/07 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
台湾最大网路书店:博客来
2018/03/18 全球购物
银行职业规划书范文
2013/12/28 职场文书
师德师风演讲稿
2014/05/05 职场文书
nginx+lua单机上万并发的实现
2021/05/31 Servers
分析Python list操作为什么会错误
2021/11/17 Python
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏
vue修饰符.capture和.self的区别
2022/04/22 Vue.js
处理canvas绘制图片模糊问题
2022/05/11 Javascript