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中scipy.misc.logsumexp函数的运用场景
Jun 23 Python
Python文件夹与文件的相关操作(推荐)
Jul 25 Python
python如何在终端里面显示一张图片
Aug 17 Python
解决sublime+python3无法输出中文的问题
Dec 12 Python
python开发游戏的前期准备
May 05 Python
使用python接入微信聊天机器人
Mar 31 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
Windows平台Python编程必会模块之pywin32介绍
Oct 01 Python
Python创建简单的神经网络实例讲解
Jan 04 Python
理解python中装饰器的作用
Jul 21 Python
尝试使用Python爬取城市租房信息
Apr 12 Python
Python实现数据的序列化操作详解
Jul 07 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往windows中添加用户
2006/12/06 PHP
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
php实例分享之二维数组排序
2014/05/15 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
ucenter中词语过滤原理分析
2016/07/13 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
javascript 写类方式之一
2009/07/05 Javascript
jQuery 第二课 操作包装集元素代码
2010/03/14 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
js中哈希表的几种用法总结
2014/01/28 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
jQuery实现的自动加载页面功能示例
2016/09/04 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
浅谈Angular4中常用管道
2017/09/27 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
[07:27]DOTA2卡尔工作室 英雄介绍水晶室女篇
2013/06/21 DOTA
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
python发送邮件脚本
2018/05/22 Python
docker-py 用Python调用Docker接口的方法
2019/08/30 Python
python返回数组的索引实例
2019/11/28 Python
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
中药学自荐信
2014/06/15 职场文书
拾金不昧感谢信
2015/01/21 职场文书