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 translator使用实例
Sep 06 Python
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
Nov 19 Python
解决Python中由于logging模块误用导致的内存泄露
Apr 23 Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
python和c语言的主要区别总结
Jul 07 Python
python getpass模块用法及实例详解
Oct 07 Python
Python实现RGB与HSI颜色空间的互换方式
Nov 27 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
python读取xml文件方法解析
Aug 04 Python
最新Python idle下载、安装与使用教程图文详解
Nov 28 Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 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制作简单的内容采集器的原理分析
2008/10/01 PHP
php 获得汉字拼音首字母的函数
2009/08/01 PHP
php表单提交实例讲解
2015/11/12 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
PHP实现计算器小功能
2020/08/28 PHP
jquery中文乱码的多种解决方法
2013/06/21 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
Bootstrap模态框案例解析
2017/03/05 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
vue.js删除列表中的一行
2018/06/30 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
JS中FormData类实现文件上传
2020/03/27 Javascript
python中日志logging模块的性能及多进程详解
2017/07/18 Python
Python set常用操作函数集锦
2017/11/15 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
pandas数据集的端到端处理
2019/02/18 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
python Pillow图像处理方法汇总
2019/10/16 Python
Python3 A*寻路算法实现方式
2019/12/24 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
Python 串口通信的实现
2020/09/29 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
一道SQL面试题
2012/12/31 面试题
会计专业自我鉴定范文
2013/10/06 职场文书
学生会招新策划书
2014/02/14 职场文书
职务聘任书范文
2014/03/29 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
逃课检讨书范文
2015/05/06 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python