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和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
python正则表达式之作业计算器
Mar 18 Python
Django接受前端数据的几种方法总结
Nov 04 Python
浅谈Python NLP入门教程
Dec 25 Python
python3写的简单本地文件上传服务器实例
Jun 04 Python
Python3随机漫步生成数据并绘制
Aug 27 Python
5款Python程序员高频使用开发工具推荐
Apr 10 Python
Python3.5内置模块之random模块用法实例分析
Apr 26 Python
Python操作Sqlite正确实现方法解析
Feb 05 Python
深入浅析python变量加逗号,的含义
Feb 22 Python
pandas apply多线程实现代码
Aug 17 Python
python 爬虫爬取京东ps4售卖情况
Dec 18 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 htmlspecialchars加强版
2010/02/16 PHP
php与Mysql的一些简单的操作
2015/02/26 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
JavaScript实现找出数组中最长的连续数字序列
2014/09/03 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
2017/01/06 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
2017/07/11 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
2018/07/18 Javascript
js中数组对象去重的两种方法
2019/01/18 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
2020/02/28 Javascript
Python os模块介绍
2014/11/30 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
python和opencv实现抠图
2018/07/18 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
电子商务专业个人的自我评价分享
2013/10/29 职场文书
办公室驾驶员岗位职责
2013/11/15 职场文书
劳动工资科岗位职责范本
2014/03/02 职场文书
残疾人小组计划书
2014/04/27 职场文书
网站推广策划方案
2014/06/04 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
教你利用python实现企业微信发送消息
2021/05/23 Python
Python内置的数据类型及使用方法
2022/04/13 Python