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中的自定义函数学习笔记
Sep 23 Python
Python实现的数据结构与算法之队列详解
Apr 22 Python
Python语法快速入门指南
Oct 12 Python
Python反射的用法实例分析
Feb 11 Python
python读取和保存视频文件
Apr 16 Python
在Python中COM口的调用方法
Jul 03 Python
10个Python面试常问的问题(小结)
Nov 20 Python
Python3的socket使用方法详解
Feb 18 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
Mar 02 Python
如何在Django中使用聚合的实现示例
Mar 23 Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
Feb 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
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
2010/01/22 Javascript
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
jQuery bind事件使用详解
2011/05/05 Javascript
jquery利用event.which方法获取键盘输入值的代码
2011/10/09 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
js模拟微博发布消息
2017/02/23 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
2018/09/04 Javascript
Vue编程式跳转的实例代码详解
2019/07/10 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
python3中bytes和string之间的互相转换
2017/02/09 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
python变量的作用域是什么
2020/05/26 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
社区工作者思想汇报
2014/01/13 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
干部考核评语
2014/04/29 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
Nginx tp3.2.3 404问题解决方案
2021/03/31 Servers
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python