Python敏感词过滤DFA算法+免费附带敏感词库
DFA简介参考:https://blog.csdn.net/chenssy/article/details/26961957
此篇是上述JAVA敏感词过滤的python版本,完整版本,修改版本
首先我们看看最终处理效果
实例1:
输入字符串
处理结果
核心代码:
SensitiveFilter类
框架如下
class SensitiveFilter:#初始化def __init__(self):self.initSensitiveWordMap(self.sensitiveWordList)...#构建敏感词库def initSensitiveWordMap(self,sensitiveWordList):...#检测文本中存在的敏感词def checkSensitiveWord(self,txt,beginIndex=0):...#得到输入字符串中敏感词列表def getSensitiveWord(self,txt):...#替换文本中的敏感词def replaceSensitiveWord(self,txt,replaceChar='*'):...
下面看具体的每个函数
Part 1
init函数 初始化
def __init__(self):# file把敏感词库加载到列表中file = open(Dir_sensitive, 'r', encoding = 'ANSI')file_lst = file.readlines()self.sensitiveWordList = [i.split('\n')[0] for i in file_lst]# print(sensitiveWordList[:10])# file1把停用词加载到列表中file1 = open(Dir_stopWord, 'r', encoding = 'ANSI')file1_lst = file1.readlines()self.stopWordList = [i.split('\n')[0] for i in file1_lst]##得到sensitive字典self.sensitiveWordMap = self.initSensitiveWordMap(self.sensitiveWordList)
Part 2
initSensitiveWordMap函数 构建敏感词库
#构建敏感词库def initSensitiveWordMap(self,sensitiveWordList):sensitiveWordMap = {}# 读取每一行,每一个word都是一个敏感词for word in sensitiveWordList:nowMap=sensitiveWordMap#遍历该敏感词的每一个特定字符for i in range(len(word)):keychar=word[i]wordMap=nowMap.get(keychar)if wordMap !=None:#nowMap更新为下一层nowMap=wordMapelse:#不存在则构建一个map,isEnd设置为0,因为不是最后一个newNextMap={}newNextMap["isEnd"]=0nowMap[keychar]=newNextMapnowMap=newNextMap#到这个词末尾字符if i==len(word)-1:nowMap["isEnd"]=1#print(sensitiveWordMap)return sensitiveWordMap
Part 3
checkSensitiveWord函数 检测输入文本,并返回敏感词长度
def checkSensitiveWord(self,txt,beginIndex=0):''':param txt: 输入待检测的文本:param beginIndex:输入文本开始的下标:return:返回敏感词字符的长度'''nowMap=self.sensitiveWordMapsensitiveWordLen=0 #敏感词的长度containChar_sensitiveWordLen=0 #包括特殊字符敏感词的长度endFlag=False #结束标记位for i in range(beginIndex,len(txt)):char=txt[i]if char in self.stopWordList:containChar_sensitiveWordLen+=1continuenowMap=nowMap.get(char)if nowMap != None:sensitiveWordLen+=1containChar_sensitiveWordLen+=1#结束位置为Trueif nowMap.get("isEnd")==1:endFlag=Trueelse:breakif endFlag==False:containChar_sensitiveWordLen=0#print(sensitiveWordLen)return containChar_sensitiveWordLen
Part 4
getSensitiveWord函数 得到输入文本中存在的敏感词列表
def getSensitiveWord(self,txt):cur_txt_sensitiveList=[]#注意,并不是一个个char查找的,找到敏感词会i增强敏感词的长度for i in range(len(txt)):length=self.checkSensitiveWord(txt,i)if length>0:word=txt[i:i+length]cur_txt_sensitiveList.append(word)i=i+length-1 #出了循环还要+1 i+length是没有检测到的,#下次直接从i+length开始return cur_txt_sensitiveList
Part 5
replaceSensitiveWord函数 敏感词替换部分
def replaceSensitiveWord(self,txt,replaceChar='*'):Lst=self.getSensitiveWord(txt)#print(Lst)for word in Lst:replaceStr=len(word)*replaceChartxt=txt.replace(word,replaceStr)return txt
敏感词和停用词可以自定义
格式如下
完整代码
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# author:zbt
# datetime:2020-03-16 11:53
# software: PyCharm
Dir_sensitive='C:\\Users\\zbt\\Desktop\\X实习\\敏感词【ing】\\敏感词.txt'
Dir_stopWord='C:\\Users\\zbt\\Desktop\\X实习\\敏感词【ing】\\停用词.txt'
class SensitiveFilter:def __init__(self):# file把敏感词库加载到列表中file = open(Dir_sensitive, 'r', encoding = 'ANSI')file_lst = file.readlines()self.sensitiveWordList = [i.split('\n')[0] for i in file_lst]# print(sensitiveWordList[:10])# >>['1234', '12345', '123456', '甲基麻黄碱', '来曲唑', '依西美坦', '阿那曲唑', '螺内酯', '沙美特罗', '丙磺舒']# file1把停用词加载到列表中file1 = open(Dir_stopWord, 'r', encoding = 'ANSI')file1_lst = file1.readlines()self.stopWordList = [i.split('\n')[0] for i in file1_lst]##得到sensitive字典self.sensitiveWordMap = self.initSensitiveWordMap(self.sensitiveWordList)#构建敏感词库def initSensitiveWordMap(self,sensitiveWordList):sensitiveWordMap = {}# 读取每一行,每一个word都是一个敏感词for word in sensitiveWordList:nowMap=sensitiveWordMap#遍历该敏感词的每一个特定字符for i in range(len(word)):keychar=word[i]wordMap=nowMap.get(keychar)if wordMap !=None:#nowMap更新为下一层nowMap=wordMapelse:#不存在则构建一个map,isEnd设置为0,因为不是最后一个newNextMap={}newNextMap["isEnd"]=0nowMap[keychar]=newNextMapnowMap=newNextMap#到这个词末尾字符if i==len(word)-1:nowMap["isEnd"]=1#print(sensitiveWordMap)return sensitiveWordMapdef checkSensitiveWord(self,txt,beginIndex=0):''':param txt: 输入待检测的文本:param beginIndex:输入文本开始的下标:return:返回敏感词字符的长度'''nowMap=self.sensitiveWordMapsensitiveWordLen=0 #敏感词的长度containChar_sensitiveWordLen=0 #包括特殊字符敏感词的长度endFlag=False #结束标记位for i in range(beginIndex,len(txt)):char=txt[i]if char in self.stopWordList:containChar_sensitiveWordLen+=1continuenowMap=nowMap.get(char)if nowMap != None:sensitiveWordLen+=1containChar_sensitiveWordLen+=1#结束位置为Trueif nowMap.get("isEnd")==1:endFlag=Trueelse:breakif endFlag==False:containChar_sensitiveWordLen=0#print(sensitiveWordLen)return containChar_sensitiveWordLendef getSensitiveWord(self,txt):cur_txt_sensitiveList=[]#注意,并不是一个个char查找的,找到敏感词会i增强敏感词的长度for i in range(len(txt)):length=self.checkSensitiveWord(txt,i)if length>0:word=txt[i:i+length]cur_txt_sensitiveList.append(word)i=i+length-1 #出了循环还要+1 i+length是没有检测到的,下次直接从i+length开始return cur_txt_sensitiveListdef replaceSensitiveWord(self,txt,replaceChar='*'):Lst=self.getSensitiveWord(txt)#print(Lst)for word in Lst:replaceStr=len(word)*replaceChartxt=txt.replace(word,replaceStr)return txtif __name__ == "__main__":str="blablablabla"Filter=SensitiveFilter()replaceStr=Filter.replaceSensitiveWord(str)print(replaceStr)
最后免费附带敏感词和停用词
https://pan.baidu.com/s/1AftA45Zdz2_AtVJEuI5jHA
密码
b0rs
Python敏感词过滤DFA算法+免费附带敏感词库相关推荐
- 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现
文章目录 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现 代码如下 package utils;import com.goo ...
- 对敏感词过滤(DFA算法)的思考与理解
对敏感词过滤的思考与理解 一.技术概述 1.这个技术是干什么用的? 2.学习这个技术的原因 3.技术的难点在哪 二.技术详述 1.流程图 2.代码 三.技术过程中遇见的问题和解决过程 四.总结 五.参 ...
- 敏感词或关键词过滤,DFA算法详解及python代码实现
一.前言 近期项目有了一个过滤敏感词的功能需求,在网上找了一些方法及解说,发现DFA算法比较好用,容易实现,但很多文章解释得不太清楚,这里将其详细描述,并用python代码实现. 二.DFA算法详解 ...
- dfa算法 java_java实现敏感词过滤(DFA算法)
小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 在写之前,小Alan给大家推荐一篇来自http://cmsblogs.com/?p=1 ...
- 敏感词之 DFA 算法
敏感词之 DFA 算法 常用算法 遍历匹配 将输入的词语,与词库中的敏感词逐个字符遍历,对比是否包含 优点:思路简单,易于实现(KMP 算法,Brute-Force 算法) 缺点:当词库数目非常大时, ...
- Java 敏感词过滤(DFA有穷自动机)
Java 敏感词过滤 DFA有穷自动机 初始化敏感词 构建树 查询 完整代码如下 后记 初始化敏感词 使用set集合,可以查询数据库. /*** 初始化值* @return*/private stat ...
- Python+Django+Mysql简单在线课程推荐系统 基于用户、项目、内容的协同过滤推荐算法 SimpleOnlineCourseCFRSPyth python实现协同过滤推荐算法实现源代码下载
Python+Django+Mysql简单在线课程推荐系统 基于用户.项目.内容的协同过滤推荐算法 SimpleOnlineCourseCFRSPyth python实现协同过滤推荐算法实现源代码下载 ...
- python协同过滤算法_详解python实现协同过滤推荐算法
不同的数据.不同的程序猿写出的协同过滤推荐算法不同,但其核心是一致的,本文主要介绍了python实现协同过滤推荐算法完整代码示例,具有一定借鉴价值,需要的朋友可以参考下.希望能帮助到大家. 测试数据 ...
- Python+Django+Mysql个性化二手车推荐系统 汽车推荐系统 基于用户、项目、内容的协同过滤推荐算法 WebCarCFRSPython python实现协同过滤推荐算法实现源代码下载
Python+Django+Mysql个性化二手车推荐系统 汽车推荐系统 基于用户.项目.内容的协同过滤推荐算法 WebCarCFRSPython python实现协同过滤推荐算法实现源代码下载 一. ...
- 基于DFA算法实现文章敏感词过滤
最近公司要出一个论坛系统 因为最近貌似xxx查的也比较严,所以图片和文字安全一样要注意 其中文字就涉及到敏感字过滤的问题 目前大概流传两种解决办法: 1.利用分词器分词实现过滤 比如见得比较多的 IK ...
最新文章
- java appendchild_详解javascript appendChild()的完整功能
- php 超过100m文件上传,科技常识:apache+php上传大文件以上传100M为例
- 几句话就能让你明白:IPv6与Voip
- MFC子对话框初始化问题_从一个“断言”报警说起
- Akka并发编程——第六节:Actor模型(五)
- https的ssl证书申请及服务器的nginx的配置教程
- linux复制文件到另一个目录_Linux入门之四-Linux文件目录操作
- 一个月面试近 20 家,拿下阿里 Offer!
- 硬核干货! 你的业务是否适合上链、上链有那些坑?dfuse、慢雾、MYKEY大佬为你为你指点迷津……...
- 开课吧课堂之throws如何去使用?
- POJ 2449 Remmarguts' Date (SPFA + A星算法) - from lanshui_Yang
- 下载网站TS格式文件进行合并
- java前后端分离开发思路
- 香港乐坛25年发展 [ 2005-04-24 07:28 PM | 作者:老唱片 | 来自:老唱片]
- [每日一题] 11gOCP 1z0-052 :2013-09-28 ORA-01555: snapshot too old......................C52
- 友盟推送 php,laravel5.4+umeng(友盟)集成app消息推送功能
- 网页报404解决办法
- linux挂载硬盘错误,开机后无法进入系统
- 央企建筑施工企业职工教育培训数字化解决方案
- 新知实验室_腾讯实时音视频产品体验