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中的偏函数
Apr 27 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
Python网络编程详解
Oct 31 Python
详解Python之unittest单元测试代码
Jan 24 Python
python3实现点餐系统
Jan 24 Python
详解python中@的用法
Mar 27 Python
Python日期时间Time模块实例详解
Apr 15 Python
Python找出列表中出现次数最多的元素三种方式
Feb 24 Python
django序列化时使用外键的真实值操作
Jul 15 Python
python tkinter的消息框模块(messagebox,simpledialog)
Nov 07 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
Nov 12 Python
python创建字典及相关管理操作
Apr 13 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/06/14 PHP
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
php实现的双向队列类实例
2014/09/24 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
2011/09/28 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
小试SVG之新手小白入门教程
2019/01/08 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
python中ConfigParse模块的用法
2014/09/29 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
python @property的用法及含义全面解析
2018/02/01 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
kali中python版本的切换方法
2019/07/11 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
深入了解python列表(LIST)
2020/06/08 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
英格兰足协官方商店:England Store
2019/07/12 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
喝酒检查书范文
2014/02/23 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
开会通知
2015/04/20 职场文书
全陪导游词开场白
2015/05/29 职场文书
家长意见书
2015/06/04 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js
Go语言 详解net的tcp服务
2022/04/14 Golang