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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
Python中返回字典键的值的values()方法使用
May 22 Python
Python标准库笔记struct模块的使用
Feb 22 Python
python网络爬虫学习笔记(1)
Apr 09 Python
PyQt打开保存对话框的方法和使用详解
Feb 27 Python
python实现邮件自动发送
Aug 10 Python
Python对列表的操作知识点详解
Aug 20 Python
python可迭代对象去重实例
May 15 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
Aug 02 Python
python 多进程和协程配合使用写入数据
Oct 30 Python
Django如何与Ajax交互
Apr 29 Python
Django中的JWT身份验证的实现
May 07 #Python
python开发实时可视化仪表盘的示例
Python使用scapy模块发包收包
如何用 Python 子进程关闭 Excel 自动化中的弹窗
PyTorch的Debug指南
May 07 #Python
基于Python的EasyGUI学习实践
Python列表删除重复元素与图像相似度判断及删除实例代码
You might like
关于PHP中的Class的几点个人看法
2006/10/09 PHP
PHP编码规范之注释和文件结构说明
2010/07/09 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
PHP中设置时区方法小结
2012/06/03 PHP
php获取中文拼音首字母类和函数分享
2014/04/24 PHP
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
Web前端框架bootstrap实战【第一次接触使用】
2016/12/28 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
在Python中使用列表生成式的教程
2015/04/27 Python
python实现决策树分类算法
2017/12/21 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
python爬虫 urllib模块发起post请求过程解析
2019/08/20 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
python爬取王者荣耀全皮肤的简单实现代码
2020/01/31 Python
Python使用re模块验证危险字符
2020/05/21 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
监理资料员岗位职责
2014/01/03 职场文书
会计职业生涯规划范文
2014/01/04 职场文书
疾病防治方案
2014/05/31 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
PHP基本语法
2021/03/31 PHP
HTML基础详解(上)
2021/10/16 HTML / CSS
源码安装apache脚本部署过程详解
2022/09/23 Servers