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 相关文章推荐
Python3使用requests发闪存的方法
May 11 Python
CentOS6.5设置Django开发环境
Oct 13 Python
Python pyinotify日志监控系统处理日志的方法
Mar 08 Python
python计算两个矩形框重合百分比的实例
Nov 07 Python
Python编程中flask的简介与简单使用
Dec 28 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
python数值基础知识浅析
Nov 19 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
Python多个装饰器的调用顺序实例解析
May 22 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 Python
python 调用js的四种方式
Apr 11 Python
Python趣味挑战之教你用pygame画进度条
May 31 Python
Django中的JWT身份验证的实现
May 07 #Python
python开发实时可视化仪表盘的示例
Python使用scapy模块发包收包
如何用 Python 子进程关闭 Excel 自动化中的弹窗
PyTorch的Debug指南
May 07 #Python
基于Python的EasyGUI学习实践
Python列表删除重复元素与图像相似度判断及删除实例代码
You might like
星际实力自我测试
2020/03/04 星际争霸
对盗链说再见...
2006/10/09 PHP
信用卡效验程序
2006/10/09 PHP
PHP操作数组相关函数
2011/02/03 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
深入理解PHP 数组之count 函数
2016/06/13 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
jQuery AjaxQueue改进步骤
2011/10/06 Javascript
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
一分钟理解js闭包
2016/05/04 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
Python实现豆瓣图片下载的方法
2015/05/25 Python
python如何查看微信消息撤回
2018/11/27 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
关于python多重赋值的小问题
2019/04/17 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
YesStyle美国/全球:购买亚洲时装、美容化妆品和生活百货
2017/01/16 全球购物
制衣厂各岗位职责
2013/12/02 职场文书
厕所文明标语
2014/06/11 职场文书
老龄工作先进事迹
2014/08/15 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
六年级作文之关于梦
2019/10/22 职场文书