文档章节

【python】敏感词过滤/屏蔽

mickelfeng
 mickelfeng
发布于 2017/02/24 14:43
字数 617
阅读 252
收藏 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在计算上更有效。

本文转载自:http://blog.csdn.net/zengwei0504/article/details/11873879

共有 人打赏支持
mickelfeng

mickelfeng

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

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

rsong
2017/12/26
0
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
1K
0
零宽度字符:和谐?屏蔽?不存在的

对零宽度字符完全没有头绪的可以先玩下这个Demo 什么是零宽度字符? 零宽度字符是一些不可见的,不可打印的字符。它们存在于页面中主要用于调整字符的显示格式,下面就是一些常见的零宽度字符...

yuanfux
09/04
0
0
python字符串匹配工具性能比较

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

刀心
2014/12/01
0
0
编程珠玑 - 算法优化 - 过滤敏感词

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

方旭
2011/09/21
5.3K
12

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Alibaba Sentinel 整合 Feign 的设计实现

作者 | Spring Cloud Alibaba 高级开发工程师洛夜 来自公众号阿里巴巴中间件投稿 前段时间 Hystrix 宣布不再维护之后(Hystrix 停止开发。。。Spring Cloud 何去何从?),Feign 作为一个跟 ...

Java技术栈
9分钟前
3
0
虚拟机加密

在超融合的基础设施和虚拟化成为常态的世界里,对加密的要求越来越高,越来越迫切,IT部门需考虑的重大安全问题和方法也浮现了出来。 物理数据中心时代,采取双保险式数据安全方法是相对简单...

linuxCool
13分钟前
0
0
MySQL 主从同步

MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的 MySQL主从是基于binlog的,主上须开启bin...

野雪球
25分钟前
0
0
OSChina 周一乱弹 —— 温柔的人应该这样

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @clouddyy :#每日一歌# 《フィクション-sumika》 《フィクション-sumika》 手机党少年们想听歌,请使劲儿戳(这里) 假期时间干嘛去, @for...

小小编辑
今天
202
7
[LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

描述 设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。 如何反序列化或序列化二叉树是没有限制的,你...

honeymose
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部