基于DFA算法的敏感词过滤的go语言实现

  1. DFA算法简介;
  2. 实现代码;
  3. Github链接;

基于DFA算法做的一个开箱即用的敏感词过滤服务,除了支持DFA算法的匹配外,还支持正则,和组合词的规则,代码可在这里查看 代码的github链接

在敏感词过滤的场景中,经常用到是DFA算法,至于为什么使用DFA算法,可自行百度。

敏感词过滤功能的实现主要包括两部分

  • 创建字典树,导入敏感词;
  • 对输入的句子进行敏感词匹配;

可以定义一个接口来描述两种行为,以便后续扩展不同的匹配算法(比如正则等):

type Matcher interface {//Build build MatcherBuild(words []string)//Match return match sensitive wordsMatch(text string) ([]string, string)
}

定义DFA算法的Node节点,Node节点的子节点使用map;(这里也可以使用[]string, 因为敏感词重复的长词不多,效率差不多)


type Node struct {End  boolNext map[rune]*Node
}func (n *Node) AddChild(c rune) *Node {if n.Next == nil {n.Next = make(map[rune]*Node)}//如果已经存在了,就不再往里面添加了;if next, ok := n.Next[c]; ok {return next} else {n.Next[c] = &Node{End:  false,Next: nil,}return n.Next[c]}
}func (n *Node) FindChild(c rune) *Node {if n.Next == nil {return nil}if _, ok := n.Next[c]; ok {return n.Next[c]}return nil
}func (n *Node) AddWord(word string) {node := nchars := []rune(word)for index, _ := range chars {node = node.AddChild(chars[index])}node.End = true
}

定义DFA过滤器

type DFAMatcher struct {replaceChar runeroot        *Node
}func NewDFAMather() *DFAMatcher {return &DFAMatcher{root: &Node{End: false,},}
}

构建和匹配

func (d *DFAMatcher) Build(words []string) {for _, item := range words {d.root.AddWord(item)}
}//Match 查找替换发现的敏感词
func (d *DFAMatcher) Match(text string) (sensitiveWords []string, replaceText string) {if d.root == nil {return nil, text}textChars := []rune(text)textCharsCopy := make([]rune, len(textChars))copy(textCharsCopy, textChars)length := len(textChars)for i := 0; i < length; i++ {//root本身是没有key的,root的下面一个节点,才算是第一个;temp := d.root.FindChild(textChars[i])if temp == nil {continue}j := i + 1for ; j < length && temp != nil; j++ {if temp.End {sensitiveWords = append(sensitiveWords, string(textChars[i:j]))replaceRune(textCharsCopy, '*', i, j)}temp = temp.FindChild(textChars[j])}//句子尾部命中的情况if j == length && temp != nil && temp.End {sensitiveWords = append(sensitiveWords, string(textChars[i:length]))replaceRune(textCharsCopy, '*', i, length)}}return sensitiveWords, string(textCharsCopy)
}func replaceRune(chars []rune, replaceChar rune, begin int, end int) {for i := begin; i < end; i++ {chars[i] = replaceChar}
}

基于DFA算法的敏感词过滤的go语言实现相关推荐

  1. 基于PHP的DFA算法(敏感词过滤)

    基于PHP的DFA算法(敏感词过滤) 看到网上很多的DFA算法,很多都有不同程度的问题,自己修改了一下,亲测没有问题,用在系统中过滤敏感词汇,比正则匹配的速度快很多. class DFA {priva ...

  2. java使用DFA算法实现敏感词过滤

    Java使用DFA算法实现敏感词过滤 DFA,全称 Deterministic Finite Automaton 即确定有穷自动机. 其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每 ...

  3. 一种基于DFA算法的敏感词检测JAVA程序片段

    本文章提供一种基于DFA算法的敏感词检测JAVA程序片段,如下: 1.构造多叉树数据结构 import org.jetbrains.annotations.NotNull;/*** 多叉树* @aut ...

  4. spring boot 使用DFA算法实现敏感词过滤

    spring boot 使用DFA算法实现敏感词过滤 敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的. DFA算法简介 DFA全称为:Deterministi ...

  5. java dfa 敏感词_java利用DFA算法实现敏感词过滤功能

    前言 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxoo相关的文字时)时要能检 测出来,很多项目中都会有一个敏感词管理模块,在敏感词管理模块中你可以加入敏感词,然 ...

  6. DFA算法进行敏感词过滤

    1.新建敏感词文本new_adress.txt,进行添加敏感词 2.代码 # -*- coding:utf-8 -*- import timetime1 = time.time() "&qu ...

  7. DFA算法实现敏感词过滤

    写项目时,得到一个新的需求,即实现敏感词的过滤,上网查了下,有几种实现方法,采取了DFA算法,即确定的有穷自动机算法,当初学习编译原理的时候为啥没想到DFA还能这么做,看来眼界和意识还是不够,得锻炼. ...

  8. dfa算法 java_Java实现DFA算法对敏感词、广告词过滤功能示例

    一.前言 开发中经常要处理用户一些文字的提交,所以涉及到了敏感词过滤的功能,参考资料中DFA有穷状态机算法的实现,创建有向图.完成了对敏感词.广告词的过滤,而且效率较好,所以分享一下. 具体实现: 1 ...

  9. python实现dfa过滤算法_DFA 算法实现敏感词过滤(python 实现)

    敏感词过滤的经典算法DFA ,看完相关资料后,自己实现了一下,同时做了评估实验 先上代码 #!/usr/bin/python2.6 # -*- coding: utf-8 -*- import tim ...

  10. TypeScript:Aho–Corasick算法实现敏感词过滤

    敏感词过滤应该是许多后端同事经常会遇到的需求,无论是评论.弹幕.文章,都需要做敏感词过滤处理来规避风险.在前端开发中,使用replace函数来替换字符串是我们的常规操作,在这之前我思考过如果用Java ...

最新文章

  1. ti的硬件时钟和系统时钟同步
  2. react 错误边界_React with GraphQL和错误边界中的自定义错误页面
  3. Python入门篇-匿名函数
  4. ADO.NET与ADO
  5. php使用webuploader表单上传文件覆盖文件key doesn't match with scope的问题和解决思路
  6. SGU 109 Magic of David Copperfield II
  7. 实验问题总结与分享之DNS(Domain Name Server)
  8. Debian 9.6.0 + OpenMediaVault 4.x : U盘作系统盘时遇到的问题
  9. 重返数学史的黄金时代,由数学推动诞生的人工智能,一部人类智慧形成的历史
  10. 通过java.net.URLConnection发送HTTP请求
  11. javascript总结48:正则表达式(RegExp)
  12. JDBC10 Blob二进制对象
  13. 10 个 Python 项目简单又超有趣
  14. 使用bus hound发送包的方法
  15. 【渝粤题库】广东开放大学 标准化法律法规 形成性考核
  16. 2020年主流服务器主板,电脑主板怎么选(2020电脑主板选购指南及检测)
  17. AMA指标代码逐一解释,附源码(python)
  18. 科学计算机如何进行复数运算,教你如何用你的卡西欧学生计算器进行复数运算!...
  19. Spring MVC AOP切面失效原因与处理
  20. 如何用手机扫二维码盘点海量固定资产?

热门文章

  1. 用Multisim搭建三极管输出特性曲线及负载线产生电路
  2. 数据科学家成长指南(上)
  3. 二乘二(二阶)魔方教程,看完教程拼不出来我给你钱!
  4. 美团外卖数据采集接口
  5. 陈进: 创业维艰吗? 换个皮肤就能获批一亿经费!
  6. MATLAB高斯迭代算法,matlab实现高斯赛德尔迭代法解方程组
  7. 前端面试-面试官常见问题
  8. html代码替换正则:把lt;ssgt;lt;img src=quot;aquot; data=quot;bquot;gt;lt;/ssgt;换成lt;img src=b /gt;
  9. 频响函数和传递函数详解-工程实例
  10. html 显示闹钟,闹钟设置.html