原文:https://blog.csdn.net/u013421629/article/details/83178970

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

1、DFA过滤敏感词算法

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

python 实现DFA算法:

  1. # -*- coding:utf-8 -*-
  2. import time
  3. time1=time.time()
  4. # DFA算法
  5. class DFAFilter():
  6. def __init__(self):
  7. self.keyword_chains = {}
  8. self.delimit = '\x00'
  9. def add(self, keyword):
  10. keyword = keyword.lower()
  11. chars = keyword.strip()
  12. if not chars:
  13. return
  14. level = self.keyword_chains
  15. for i in range(len(chars)):
  16. if chars[i] in level:
  17. level = level[chars[i]]
  18. else:
  19. if not isinstance(level, dict):
  20. break
  21. for j in range(i, len(chars)):
  22. level[chars[j]] = {}
  23. last_level, last_char = level, chars[j]
  24. level = level[chars[j]]
  25. last_level[last_char] = {self.delimit: 0}
  26. break
  27. if i == len(chars) - 1:
  28. level[self.delimit] = 0
  29. def parse(self, path):
  30. with open(path,encoding='utf-8') as f:
  31. for keyword in f:
  32. self.add(str(keyword).strip())
  33. def filter(self, message, repl="*"):
  34. message = message.lower()
  35. ret = []
  36. start = 0
  37. while start < len(message):
  38. level = self.keyword_chains
  39. step_ins = 0
  40. for char in message[start:]:
  41. if char in level:
  42. step_ins += 1
  43. if self.delimit not in level[char]:
  44. level = level[char]
  45. else:
  46. ret.append(repl * step_ins)
  47. start += step_ins - 1
  48. break
  49. else:
  50. ret.append(message[start])
  51. break
  52. else:
  53. ret.append(message[start])
  54. start += 1
  55. return ''.join(ret)
  56. if __name__ == "__main__":
  57. gfw = DFAFilter()
  58. path="F:/文本反垃圾算法/sensitive_words.txt"
  59. gfw.parse(path)
  60. text="新疆骚乱苹果新品发布会雞八"
  61. result = gfw.filter(text)
  62. print(text)
  63. print(result)
  64. time2 = time.time()
  65. print('总共耗时:' + str(time2 - time1) + 's')
 

运行效果:

  1. E:\laidefa\python.exe "E:/Program Files/pycharmproject/敏感词过滤算法/敏感词过滤算法DFA.py"
  2. 新疆骚乱苹果新品发布会雞八
  3. ****苹果新品发布会**
  4. 总共耗时:0.0010344982147216797s
  5. Process finished with exit code 0
 

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

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

  1. # -*- coding:utf-8 -*-
  2. import time
  3. time1=time.time()
  4. # AC自动机算法
  5. class node(object):
  6. def __init__(self):
  7. self.next = {}
  8. self.fail = None
  9. self.isWord = False
  10. self.word = ""
  11. class ac_automation(object):
  12. def __init__(self):
  13. self.root = node()
  14. # 添加敏感词函数
  15. def addword(self, word):
  16. temp_root = self.root
  17. for char in word:
  18. if char not in temp_root.next:
  19. temp_root.next[char] = node()
  20. temp_root = temp_root.next[char]
  21. temp_root.isWord = True
  22. temp_root.word = word
  23. # 失败指针函数
  24. def make_fail(self):
  25. temp_que = []
  26. temp_que.append(self.root)
  27. while len(temp_que) != 0:
  28. temp = temp_que.pop(0)
  29. p = None
  30. for key,value in temp.next.item():
  31. if temp == self.root:
  32. temp.next[key].fail = self.root
  33. else:
  34. p = temp.fail
  35. while p is not None:
  36. if key in p.next:
  37. temp.next[key].fail = p.fail
  38. break
  39. p = p.fail
  40. if p is None:
  41. temp.next[key].fail = self.root
  42. temp_que.append(temp.next[key])
  43. # 查找敏感词函数
  44. def search(self, content):
  45. p = self.root
  46. result = []
  47. currentposition = 0
  48. while currentposition < len(content):
  49. word = content[currentposition]
  50. while word in p.next == False and p != self.root:
  51. p = p.fail
  52. if word in p.next:
  53. p = p.next[word]
  54. else:
  55. p = self.root
  56. if p.isWord:
  57. result.append(p.word)
  58. p = self.root
  59. currentposition += 1
  60. return result
  61. # 加载敏感词库函数
  62. def parse(self, path):
  63. with open(path,encoding='utf-8') as f:
  64. for keyword in f:
  65. self.addword(str(keyword).strip())
  66. # 敏感词替换函数
  67. def words_replace(self, text):
  68. """
  69. :param ah: AC自动机
  70. :param text: 文本
  71. :return: 过滤敏感词之后的文本
  72. """
  73. result = list(set(self.search(text)))
  74. for x in result:
  75. m = text.replace(x, '*' * len(x))
  76. text = m
  77. return text
  78. if __name__ == '__main__':
  79. ah = ac_automation()
  80. path='F:/文本反垃圾算法/sensitive_words.txt'
  81. ah.parse(path)
  82. text1="新疆骚乱苹果新品发布会雞八"
  83. text2=ah.words_replace(text1)
  84. print(text1)
  85. print(text2)
  86. time2 = time.time()
  87. print('总共耗时:' + str(time2 - time1) + 's')
 
  1. E:\laidefa\python.exe "E:/Program Files/pycharmproject/敏感词过滤算法/AC自动机过滤敏感词算法.py"
  2. 新疆骚乱苹果新品发布会雞八
  3. ****苹果新品发布会**
  4. 总共耗时:0.0010304450988769531s
  5. Process finished with exit code 0
 

3、java 实现参考链接:
https://www.cnblogs.com/AlanLee/p/5329555.html

4、敏感词生成

  1. # -*- coding:utf-8 -*-
  2. path = 'F:/文本反垃圾算法/sensitive_worlds7.txt'
  3. from 敏感词过滤算法.langconv import *
  4. import pandas as pd
  5. import pypinyin
  6. # 文本转拼音
  7. def pinyin(text):
  8. """
  9. :param text: 文本
  10. :return: 文本转拼音
  11. """
  12. gap = ' '
  13. piny = gap.join(pypinyin.lazy_pinyin(text))
  14. return piny
  15. # 繁体转简体
  16. def tradition2simple(text):
  17. """
  18. :param text: 要过滤的文本
  19. :return: 繁体转简体函数
  20. """
  21. line = Converter('zh-hans').convert(text)
  22. return line
  23. data=pd.read_csv(path,sep='\t')
  24. chinise_lable=[]
  25. chinise_type=data['type']
  26. for i in data['lable']:
  27. line=tradition2simple(i)
  28. chinise_lable.append(line)
  29. chg_data=pd.DataFrame({'lable':chinise_lable,'type':chinise_type})
  30. eng_lable=[]
  31. eng_type=data['type']
  32. for i in data['lable']:
  33. # print(i)
  34. piny=pinyin(i)
  35. # print(piny)
  36. eng_lable.append(piny)
  37. eng_data=pd.DataFrame({'lable':eng_lable,'type':eng_type})
  38. # print(eng_data)
  39. # 合并
  40. result=chg_data.append(eng_data,ignore_index=True)
  41. # 数据框去重
  42. res = result.drop_duplicates()
  43. print(res)
  44. # 输出
  45. res.to_csv('F:/文本反垃圾算法/中英混合的敏感词10.txt',header=True,index=False,sep='\t',encoding='utf-8')

(转)两种高效过滤敏感词算法--DFA算法和AC自动机算法的更多相关文章

  1. 聚类算法K-Means算法和Mean Shift算法介绍及实现

    Question:什么是聚类算法 1.聚类算法是一种非监督学习算法 2.聚类是在没有给定划分类别的情况下,根据数据相似度进行样本分组的一种方法 3.理论上,相同的组的数据之间有相同的属性或者是特征,不 ...

  2. 高效Java敏感词、关键词过滤工具包_过滤非法词句

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

  3. 【SpringBoot】前缀树 Trie 过滤敏感词

    1.过滤敏感词 Spring Boot实践,开发社区核心功能 完成过滤敏感词 Trie 名称:Trie也叫做字典树.前缀树(Prefix Tree).单词查找树 特点:查找效率高,消耗内存大 应用:字 ...

  4. web前端js过滤敏感词

    web前端js过滤敏感词 这里是用文本输入框还有文本域绑定了失去焦点事件,然后再遍历敏感词数组进行匹配和替换. var keywords=["阿扁","呵呵", ...

  5. 两种高效的事件处理模式(Proactor和Reactor)

    典型的多线程服务器的线程模型 1. 每个请求创建一个线程,使用阻塞式 I/O 操作 这是最简单的线程模型,1个线程处理1个连接的全部生命周期.该模型的优点在于:这个模型足够简单,它可以实现复杂的业务场 ...

  6. SpringBoot开发十四-过滤敏感词

    项目需求-过滤敏感词 利用 Tire 树实现过滤敏感词 定义前缀树,根据敏感词初始化前缀树,编写过滤敏感词的方法 代码实现 我们首先把敏感词存到一个文件 sensitive.txt: 赌博 嫖娼 吸毒 ...

  7. 过滤敏感词工具类SensitiveFilter

    网上过滤敏感词工具类有的存在挺多bug,这是我自己改用的过滤敏感词工具类,目前来说没啥bug,如果有bug欢迎在评论指出 使用前缀树 Trie 实现的过滤敏感词,树节点用静态内部类表示了,都写在一个 ...

  8. AC自动机-算法详解

    What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...

  9. AC自动机算法详解

    首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章, ...

随机推荐

  1. 【原创】003 | 搭上基于SpringBoot事务思想实战专车

    前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 专车介绍 该趟专车是开往基于Spring Boot事务思想实战的专车,在上一篇 搭 ...

  2. 报错 Please make sure you have the correct access rights and the repository exists (git 添加ssh密钥 )

    1.设置Git的user name和email $ git config --global user.name "wubaiwan" $ git config --global u ...

  3. aplipay支付-app支付之前后端实现

    目录 前言 一 前台aplipay实现 1.1 安装0x5e/react-native-alipay 1.2. 配置 1.3. Alipay.pay(orderStr) 二 后端 2.1 服务端sdk ...

  4. 2019沈阳icpc网络赛H德州扑克

    题面:https://nanti.jisuanke.com/t/41408 题意:A,2,3,4,5,6,7,8,9,10,J,Q,K,13张牌,无花色之分,val为1~13. 给n个人名+n个牌,输 ...

  5. NETCore Bootstrap Admin 通用后台管理权限 [3]: 精简版任务调度模块

    前言 NETCore 里说到任务调度,大家首先想到的应该是大名鼎鼎的 QuartzNET 与 Hangfire,然而本篇介绍的却都不是,而是 Bootstrap Admin(以下简称 BA)通用后台权 ...

  6. 模拟实现 Promise(小白版)

    模拟实现 Promise(小白版) 本篇来讲讲如何模拟实现一个 Promise 的基本功能,网上这类文章已经很多,本篇笔墨会比较多,因为想用自己的理解,用白话文来讲讲 Promise 的基本规范,参考 ...

  7. Docker私有仓库搭建与界面化管理

    一.关于Registry 官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去. 但是有时候我们的使用场景需要我们拥有一个私有的镜 ...

  8. Nginx(二)--nginx的核心功能

    反向代理 nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理. proxy_pass 既可以是ip地址,也可以是域名,同时还可以指定端 ...

  9. 大数据学习笔记——HDFS理论知识之编辑日志与镜像文件

    HDFS文件系统——编辑日志和镜像文件详细介绍 我们知道,启动Hadoop之后,在主节点下会产生Namenode,即名称节点进程,该节点的目录下会保存一份元数据,用来记录文件的索引,而在从节点上即Da ...

  10. 【hibernate】常用注解

    [hibernate]常用注解 转载:https://www.cnblogs.com/yangchongxing/p/10357118.html 目录 ======================== ...