文档章节

【python】敏感词过滤/屏蔽

mickelfeng
 mickelfeng
发布于 2017/02/24 14:43
字数 617
阅读 120
收藏 0
点赞 0
评论 0

【问题描述】

文档检查的时候,我们希望过滤掉敏感词,例如有字符串A="asbcd",我们希望过滤掉B=“sb”,需要在A中找到B,然后,做相关的标记或者替换。

【可行思路】

1、暴力匹配--这个就算了,只是说说而已,实际应用中很少的。

2、正则表达式

3、利用DFA实现文字过滤

      在文章http://ahuaxuan.iteye.com/blog/336577?page=2#comments中提到正则表达式不是一个很好的选择,DFA才是。

本文将实现正则表达式和DFA的方法,并从时间上给出二者比较。

【算法选择】

==========================DFA=================================

http://pythoner.org/code/43/

#encoding:utf-8  
  
from time import time  
  
words = [  
'fuck',  
]  
   
#wordTree = wordTree.append(0)  
   
def create_word_tree(words_list):  
    wordTree = [None for i in range(0,256)]  
    wordTree = [wordTree,0]  
    for word in words_list:  
   
        # 每个单词对应一个tree  
        tree = wordTree[0]  
        for i  in range(0,len(word)):  
            little = word[i]  
            index = ord(little)  
            # 已经到最后一个字母了  
            if i ==  len(word) -1:  
                tree[index] = 1  
            else:  
                tree[index] = [[None for x in range(0,256)],1]  
                tree = tree[index][0]  
   
    return wordTree  
   
def translate(string,tree):  
    temp = tree  
    result = ''  
    for little in string:  
        index = ord(little)  
        temp = temp[0][index]  
        if temp == None:  
            temp = tree  
            #print 'can not find'  
        else:  
            result += chr(index)  
        if temp == 1:   
            return string.replace(result,'*')   
  
tree = create_word_tree(words)  
fileP = open('test.txt')  
s = fileP.read()  
beginTime = time()  
s2 = translate(s,tree)  
endTime = time()  
  
print endTime - beginTime  
fileQ = open('test_result2.txt', 'w')  
fileQ.write(s2)  
fileP.close()  
fileQ.close()  

PS:本程序基本用的上面链接中给出的程序的写法,逻辑上好像有点问题,后面的时间上的比较在保证输出结果一致的情况下给出。

==========================正则================================

#encoding:utf-8  
  
import re  
from time import time  
  
words = [  
'fuck'  
]  
  
print 'start...'  
  
def translate(s):  
    reStr = ''  
    wordLen = len(words)  
    count = 0;  
    for word in words:  
        count = count + 1  
        if wordLen == count:  
            reStr = reStr + word  
        else:  
            reStr = reStr + word + '|'  
    #print reStr  
          
    pattern = re.compile(reStr)  
    s2 = re.sub(pattern, '**', s)  
    #print s2  
    return s2  
      
fileP = open('test.txt')  
s = fileP.read()  
beginTime = time()  
s2 = translate(s)  
endTime =time()  
print endTime - beginTime  
fileQ = open('test_result.txt', 'w')  
fileQ.write(s2)  
fileP.close()  
fileQ.close()  

【注意】-------------------------------

正则方法中的translate函数

reStr = ''  
 wordLen = len(words)  
 count = 0;  
 for word in words:  
     count = count + 1  
     if wordLen == count:  
         reStr = reStr + word  
     else:  
         reStr = reStr + word + '|'  

这一段代码是用敏感词求正则表达式(和DFA中建立wordTree一样属于过滤的前处理)比较的时候应该移到translate函数外。

重新计算时间,不影响结论。

-------------------------------------------
时间上的比较

PS : 真的要给一个大一点的输入文件才行。

  DFA 正则
秒数 0.09 0.31


【结论】

正则表示式来实现这个问题更直观容易实现,但DFA在计算上更有效。

© 著作权归作者所有

共有 人打赏支持
mickelfeng

mickelfeng

粉丝 226
博文 963
码字总数 548356
作品 0
成都
高级程序员
利用函数计算实现网络游戏或视频直播中的敏感词检测

一、概述 目前,网络游戏和视频直播都是很火爆的产业,然而,无论在多人在线网络游戏(MMORPG)中,还是在游戏视频直播或者其他直播中(弹幕),玩家或者用户的在线交流和互动都是它们的核心乐趣...

rsong ⋅ 2017/12/26 ⋅ 0

基于DFA的敏感词检测和替换模块--SmallGFW

smallgfw: 一个基于DFA的敏感词检测和替换模块,用法如doctest所示。 >>> gfw = GFW() >>> gfw.set(["sexy","girl","love","shit"])#设置敏感词列表 >>> s = gfw.replace("shit!,Cherry is a......

fxsjy ⋅ 2012/03/07 ⋅ 0

python字符串匹配工具性能比较

做敏感词过滤的时候要用到字符串匹配,从一个文件中读入需要匹配的敏感词,和一段文本去匹配,用string的find方法是不太合适了,搜了一下,发现AC自动机的方式更好。AC自动机是一个可以用来快...

刀心 ⋅ 2014/12/01 ⋅ 0

编程珠玑 - 算法优化 - 过滤敏感词

编程珠玑 - 算法优化 - 过滤敏感词 - 第一步:快速实现 http://my.oschina.net/fangxu/blog/32380 编程珠玑 - 算法优化 - 过滤敏感词 - 第二步:效率问题 http://my.oschina.net/fangxu/blo...

方旭 ⋅ 2011/09/21 ⋅ 12

NLPIR深度机器学习的文本分类

近年来,随着Intemet的迅猛发展,网络信息和数据信息不断扩张,如何有效利用这一丰富的数据信息,已成为广大信息技术工作者所关注的焦点之一。为了快速、准确的从大量的数据信息中找出用户所...

ljrj123 ⋅ 2017/12/12 ⋅ 0

Java实现敏感词过滤

敏感词、文字过滤是一个网站必不可少的功能,如何设计一个好的、高效的过滤算法是非常有必要的。前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非...

-蒋全忠- ⋅ 2015/05/21 ⋅ 0

敏感词过滤服务--bbspam

现今,Web2.0网站往往面临着一件非常窘困的事情。 对于用户的输入内容很难控制,那就意味着随时都有可能遇到"违禁词"、"敏感词",不是被迫删除信息,就是被强制和谐,或者投入大量的人力进行...

chancey ⋅ 2010/11/24 ⋅ 0

放弃了,Google 搜索不再提醒敏感关键字

年前,Google搜索在中国使出了一个“绝招”,对于涉嫌敏感字的直接予以提醒,但这种另类的做法效果并不好,一来完全打乱了用户的正常搜索,二来也暴露了更多敏感信息。现在,Google已经放弃了...

杨坤乾 ⋅ 2013/01/05 ⋅ 155

求指教,敏感词过滤问题

各位高手,请问在发帖的时候需要敏感词过滤,那这些敏感词过滤应该存放在哪里,数据库中,还是文件中。

jerry2012 ⋅ 2013/10/08 ⋅ 2

基于DFA敏感词查询的算法简析

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: a.直接将敏感词组织成S...

李晓晖 ⋅ 2016/10/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 39分钟前 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 45分钟前 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 昨天 ⋅ 0

Confluence 6 重新获得站点备份文件

Confluence 将会创建备份,同时压缩 XML 文件后存储熬你的 <home-directory>/backups> 目录中。你需要自己访问你安装的 Confluence 服务器,并且从服务器上获得这个文件。 运行从 Confluence...

honeymose ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部