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的MongoDB模块PyMongo操作方法集锦
Jan 05 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
mac 安装python网络请求包requests方法
Jun 13 Python
python pickle存储、读取大数据量列表、字典数据的方法
Jul 07 Python
python同步windows和linux文件
Aug 29 Python
python网络编程socket实现服务端、客户端操作详解
Mar 24 Python
简单了解如何封装自己的Python包
Jul 08 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 Python
MATLAB 全景图切割及盒图显示的实现步骤
May 14 Python
详解python字符串驻留技术
May 21 Python
Python 数据可视化之Bokeh详解
Nov 02 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 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
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
深入理解PHP中的count函数
2016/05/31 PHP
利用php的ob缓存机制实现页面静态化方法
2017/07/09 PHP
js获取当前日期前七天的方法
2015/02/28 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
nodejs模块学习之connect解析
2017/07/05 NodeJs
Node.js静态服务器的实现方法
2018/02/28 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
Python中规范定义命名空间的一些建议
2016/06/04 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
Python算法中的时间复杂度问题
2019/11/19 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
日本航空官方网站:JAL
2019/06/19 全球购物
运动会标语
2014/06/21 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
就业协议书范本
2014/10/08 职场文书
支行行长竞聘报告
2014/11/06 职场文书
2014年学校工作总结
2014/11/20 职场文书
捐助倡议书
2015/01/19 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
python中filter,map,reduce的作用
2022/06/10 Python