python实现过滤敏感词


Posted in Python onMay 08, 2021

简述:

关于敏感词过滤可以看成是一种文本反垃圾算法,例如
 题目:敏感词文本文件 filtered_words.txt,当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」,则变成「**是个好城市」
 代码:

#coding=utf-8
def filterwords(x):
    with open(x,'r') as f:
        text=f.read()
    print text.split('\n')
    userinput=raw_input('myinput:')
    for i in text.split('\n'):
        if i in userinput:
            replace_str='*'*len(i.decode('utf-8'))
            word=userinput.replace(i,replace_str)
            return word

print filterwords('filtered_words.txt')

再例如反黄系列:

开发敏感词语过滤程序,提示用户输入评论内容,如果用户输入的内容中包含特殊的字符:
敏感词列表 li = ["苍老师","东京热",”武藤兰”,”波多野结衣”]
则将用户输入的内容中的敏感词汇替换成***,并添加到一个列表中;如果用户输入的内容没有敏感词汇,则直接添加到上述的列表中。
content = input('请输入你的内容:')
li = ["苍老师","东京热","武藤兰","波多野结衣"]
i = 0
while i < 4:
    for li[i] in content:
        li1 = content.replace('苍老师','***')
        li2 = li1.replace('东京热','***')
        li3 = li2.replace('武藤兰','***')
        li4 = li3.replace('波多野结衣','***')
    else:
        pass
    i += 1

python实现过滤敏感词

实战案例:

 一道bat面试题:快速替换10亿条标题中的5万个敏感词,有哪些解决思路?
 有十亿个标题,存在一个文件中,一行一个标题。有5万个敏感词,存在另一个文件。写一个程序过滤掉所有标题中的所有敏感词,保存到另一个文件中。

1、DFA过滤敏感词算法

在实现文字过滤的算法中,DFA是比较好的实现算法。DFA即Deterministic Finite Automaton,也就是确定有穷自动机。
 算法核心是建立了以敏感词为基础的许多敏感词树。
 python 实现DFA算法:

# -*- coding:utf-8 -*-

import time
time1=time.time()

# DFA算法
class DFAFilter():
    def __init__(self):
        self.keyword_chains = {}
        self.delimit = '\x00'

    def add(self, keyword):
        keyword = keyword.lower()
        chars = keyword.strip()
        if not chars:
            return
        level = self.keyword_chains
        for i in range(len(chars)):
            if chars[i] in level:
                level = level[chars[i]]
            else:
                if not isinstance(level, dict):
                    break
                for j in range(i, len(chars)):
                    level[chars[j]] = {}
                    last_level, last_char = level, chars[j]
                    level = level[chars[j]]
                last_level[last_char] = {self.delimit: 0}
                break
        if i == len(chars) - 1:
            level[self.delimit] = 0

    def parse(self, path):
        with open(path,encoding='utf-8') as f:
            for keyword in f:
                self.add(str(keyword).strip())

    def filter(self, message, repl="*"):
        message = message.lower()
        ret = []
        start = 0
        while start < len(message):
            level = self.keyword_chains
            step_ins = 0
            for char in message[start:]:
                if char in level:
                    step_ins += 1
                    if self.delimit not in level[char]:
                        level = level[char]
                    else:
                        ret.append(repl * step_ins)
                        start += step_ins - 1
                        break
                else:
                    ret.append(message[start])
                    break
            else:
                ret.append(message[start])
            start += 1

        return ''.join(ret)


if __name__ == "__main__":
    gfw = DFAFilter()
    path="F:/文本反垃圾算法/sensitive_words.txt"
    gfw.parse(path)
    text="新疆骚乱苹果新品发布会?八"
    result = gfw.filter(text)

    print(text)
    print(result)
    time2 = time.time()
    print('总共耗时:' + str(time2 - time1) + 's')

运行效果:

新疆骚乱苹果新品发布会?八
****苹果新品发布会**
总共耗时:0.0010344982147216797s

2、AC自动机过滤敏感词算法

AC自动机:一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。
 简单地讲,AC自动机就是字典树+kmp算法+失配指针

# -*- coding:utf-8 -*-

import time
time1=time.time()

# AC自动机算法
class node(object):
    def __init__(self):
        self.next = {}
        self.fail = None
        self.isWord = False
        self.word = ""

class ac_automation(object):

    def __init__(self):
        self.root = node()

    # 添加敏感词函数
    def addword(self, word):
        temp_root = self.root
        for char in word:
            if char not in temp_root.next:
                temp_root.next[char] = node()
            temp_root = temp_root.next[char]
        temp_root.isWord = True
        temp_root.word = word

    # 失败指针函数
    def make_fail(self):
        temp_que = []
        temp_que.append(self.root)
        while len(temp_que) != 0:
            temp = temp_que.pop(0)
            p = None
            for key,value in temp.next.item():
                if temp == self.root:
                    temp.next[key].fail = self.root
                else:
                    p = temp.fail
                    while p is not None:
                        if key in p.next:
                            temp.next[key].fail = p.fail
                            break
                        p = p.fail
                    if p is None:
                        temp.next[key].fail = self.root
                temp_que.append(temp.next[key])

    # 查找敏感词函数
    def search(self, content):
        p = self.root
        result = []
        currentposition = 0

        while currentposition < len(content):
            word = content[currentposition]
            while word in p.next == False and p != self.root:
                p = p.fail

            if word in p.next:
                p = p.next[word]
            else:
                p = self.root

            if p.isWord:
                result.append(p.word)
                p = self.root
            currentposition += 1
        return result

    # 加载敏感词库函数
    def parse(self, path):
        with open(path,encoding='utf-8') as f:
            for keyword in f:
                self.addword(str(keyword).strip())

    # 敏感词替换函数
    def words_replace(self, text):
        """
        :param ah: AC自动机
        :param text: 文本
        :return: 过滤敏感词之后的文本
        """
        result = list(set(self.search(text)))
        for x in result:
            m = text.replace(x, '*' * len(x))
            text = m
        return text





if __name__ == '__main__':

    ah = ac_automation()
    path='F:/文本反垃圾算法/sensitive_words.txt'
    ah.parse(path)
    text1="新疆骚乱苹果新品发布会?八"
    text2=ah.words_replace(text1)

    print(text1)
    print(text2)

    time2 = time.time()
    print('总共耗时:' + str(time2 - time1) + 's')

运行结果:

新疆骚乱苹果新品发布会?八
****苹果新品发布会**
总共耗时:0.0010304450988769531s

以上就是python实现过滤敏感词的详细内容,更多关于python 过滤敏感词的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python查看微信好友是否删除自己
Dec 19 Python
python3.6利用pyinstall打包py为exe的操作实例
Oct 31 Python
python批量获取html内body内容的实例
Jan 02 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
Dec 09 Python
Python3+Selenium+Chrome实现自动填写WPS表单
Feb 12 Python
Python decimal模块使用方法详解
Jun 08 Python
学python最电脑配置有要求么
Jul 05 Python
pycharm 快速解决python代码冲突的问题
Jan 15 Python
Python3爬虫RedisDump的安装步骤
Feb 20 Python
Python用requests库爬取返回为空的解决办法
Feb 21 Python
pytorch实现ResNet结构的实例代码
May 17 Python
tensorflow中的数据类型dtype用法说明
May 26 Python
Django中的JWT身份验证的实现
May 07 #Python
python开发实时可视化仪表盘的示例
Python使用scapy模块发包收包
如何用 Python 子进程关闭 Excel 自动化中的弹窗
PyTorch的Debug指南
May 07 #Python
基于Python的EasyGUI学习实践
Python列表删除重复元素与图像相似度判断及删除实例代码
You might like
php mssql 时间格式问题
2009/01/13 PHP
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
php两种无限分类方法实例
2015/04/21 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
php编程每天必学之验证码
2016/03/03 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
浅析JS操作DOM的一些常用方法
2016/05/13 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
2018/08/03 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
python和pyqt实现360的CLable控件
2014/02/21 Python
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
Python 正则表达式实现计算器功能
2017/04/29 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
python的文件操作方法汇总
2017/11/10 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
python实现自动打卡的示例代码
2020/10/10 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
生物化工专业个人自荐信
2013/09/26 职场文书
妇科医生自荐信
2013/11/05 职场文书
高级电工工作职责
2013/11/21 职场文书
教师的实习鉴定
2013/12/15 职场文书
幼儿发展评估方案
2014/06/11 职场文书
详解nodejs内置模块
2021/05/06 NodeJs