文档章节

【python】敏感词过滤/屏蔽

mickelfeng
 mickelfeng
发布于 2017/02/24 14:43
字数 617
阅读 165
收藏 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

粉丝 226
博文 2607
码字总数 566507
作品 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
python字符串匹配工具性能比较

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

刀心
2014/12/01
0
0
零宽度字符:和谐?屏蔽?不存在的

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

yuanfux
09/04
0
0
编程珠玑 - 算法优化 - 过滤敏感词

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

方旭
2011/09/21
4.7K
12

没有更多内容

加载失败,请刷新页面

加载更多

利用碎片化时间Get Linux系统

起初,我做着一份与IT毫无关系的工作,每月领着可怜的工资,一直想改变现状,但无从下手,也就是大家熟知的迷茫。我相信,每一个人都会或多或少的经历过迷茫,迷茫每一个选择,迷茫工作或者生...

Linux就该这么学
29分钟前
0
0
图像显示深入学习一:Activity启动过程

一个月左右写了图像显示深入学习之文章开篇文章表明了自己近期的计划,前半年重新学习了opengl es,c++以及Linux的一些知识,觉得是时候开始看图像这一块的源码了,边看边补缺补漏吧。 作为该...

JerryLin123
52分钟前
1
0
给MySQL授权远程访问

putty登录服务器; 登录MySQL: mysql -u root -p 新建远程用户: CREATE USER 'myusername' IDENTIFIED BY 'mypassword'; 授权: grant all on *.* to john@'101.102.103.104' identified by......

sweethome
今天
1
0
在t-io老巢造谣,不过有造谣的就会有反造谣的!

只发当事人的截图,不发表评论,以免有引导嫌疑 PS: 截图是由不同的人发过来的 本人已经不在此微信群 图3:有造谣的,就有反造谣的 图4是2018-09-23的t-io官方群的一个发言小统计,有助于让...

talent-tan
今天
100
0
heartbeat 资源

drbd+apache+heartbeat : http://blog.51cto.com/11838039/1827901 heartbeat双机热备的架设 : http://blog.51cto.com/11838039/1827560 对heaetbeat的深一步认识 : http://blog.51cto.co......

寰宇01
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部