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编程开发之类型转换convert实例分析
Nov 13 Python
Python中Iterator迭代器的使用杂谈
Jun 20 Python
使用Python将数组的元素导出到变量中(unpacking)
Oct 27 Python
Python文本相似性计算之编辑距离详解
Nov 28 Python
浅谈Python NLP入门教程
Dec 25 Python
Python中xrange与yield的用法实例分析
Dec 26 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
Dec 17 Python
python 去除二维数组/二维列表中的重复行方法
Jan 23 Python
python画微信表情符的实例代码
Oct 09 Python
Python requests模块cookie实例解析
Apr 14 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
matplotlib 多个图像共用一个colorbar的实现示例
Sep 10 Python
Django中的JWT身份验证的实现
May 07 #Python
python开发实时可视化仪表盘的示例
Python使用scapy模块发包收包
如何用 Python 子进程关闭 Excel 自动化中的弹窗
PyTorch的Debug指南
May 07 #Python
基于Python的EasyGUI学习实践
Python列表删除重复元素与图像相似度判断及删除实例代码
You might like
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
用PHP动态生成虚拟现实VRML网页
2006/10/09 PHP
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
原生javascript实现分页效果
2017/04/21 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
2020/04/09 Javascript
CentOS中升级Python版本的方法详解
2017/07/10 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
实时获取Python的print输出流方法
2019/01/07 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
基于Python爬取搜狐证券股票过程解析
2020/11/18 Python
蔻驰美国官网:COACH美国
2016/08/18 全球购物
小学生防溺水广播稿
2014/01/12 职场文书
迟到检讨书300字
2014/02/14 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
超市理货员岗位职责
2014/07/04 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
《全神贯注》教学反思
2016/02/22 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫