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 用户登录验证的小例子
Mar 06 Python
Python3实现生成随机密码的方法
Aug 23 Python
在Python中操作字典之update()方法的使用
May 22 Python
[原创]使用豆瓣提供的国内pypi源
Jul 02 Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 Python
django自带的server 让外网主机访问方法
May 14 Python
python读取xlsx的方法
Dec 25 Python
在python中将list分段并保存为array类型的方法
Jul 15 Python
Django 反向生成url实例详解
Jul 30 Python
Python利用PyExecJS库执行JS函数的案例分析
Dec 18 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
Feb 20 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 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/17 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
PHP时间处理类操作示例
2018/09/05 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
关于document.cookie的使用javascript
2008/04/11 Javascript
nodejs批量修改文件编码格式
2015/01/22 NodeJs
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
Angular.js回顾ng-app和ng-model使用技巧
2016/04/26 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
Python中的True,False条件判断实例分析
2015/01/12 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
使用PyCharm创建Django项目及基本配置详解
2018/10/24 Python
python多线程同步实例教程
2019/08/11 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
大家检讨书5000字
2014/02/03 职场文书
财务部副经理岗位职责
2014/03/14 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
经济贸易专业自荐信
2014/06/11 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
大学团日活动总结书
2015/05/11 职场文书