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 相关文章推荐
wxpython 学习笔记 第一天
Mar 16 Python
Python语言编写电脑时间自动同步小工具
Mar 08 Python
Python中正则表达式的用法实例汇总
Aug 18 Python
粗略分析Python中的内存泄漏
Apr 23 Python
Python函数式编程指南(四):生成器详解
Jun 24 Python
简述Python2与Python3的不同点
Jan 21 Python
PyQt5每天必学之进度条效果
Apr 19 Python
利用django model save方法对未更改的字段依然进行了保存
Mar 28 Python
spyder 在控制台(console)执行python文件,debug python程序方式
Apr 20 Python
python开根号实例讲解
Aug 30 Python
Pyqt助手安装PyQt5帮助文档过程图解
Nov 20 Python
Elasticsearch 基本查询和组合查询
Apr 19 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数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
js实现列表按字母排序
2020/08/11 Javascript
python修改注册表终止360进程实例
2014/10/13 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
解决python xx.py文件点击完之后一闪而过的问题
2019/06/24 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
2020/12/04 Python
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
本科生的职业生涯规划范文
2014/01/09 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
广告业务员岗位职责
2014/02/06 职场文书
环境工程专业自荐信
2014/03/03 职场文书
品质口号大全
2014/06/17 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书
文明礼貌主题班会
2015/08/14 职场文书
环保建议书作文500字
2015/09/14 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技