基于DFA算法的敏感词过滤的go语言实现
基于DFA算法的敏感词过滤的go语言实现
- DFA算法简介;
- 实现代码;
- 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语言实现相关推荐
- 基于PHP的DFA算法(敏感词过滤)
基于PHP的DFA算法(敏感词过滤) 看到网上很多的DFA算法,很多都有不同程度的问题,自己修改了一下,亲测没有问题,用在系统中过滤敏感词汇,比正则匹配的速度快很多. class DFA {priva ...
- java使用DFA算法实现敏感词过滤
Java使用DFA算法实现敏感词过滤 DFA,全称 Deterministic Finite Automaton 即确定有穷自动机. 其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每 ...
- 一种基于DFA算法的敏感词检测JAVA程序片段
本文章提供一种基于DFA算法的敏感词检测JAVA程序片段,如下: 1.构造多叉树数据结构 import org.jetbrains.annotations.NotNull;/*** 多叉树* @aut ...
- spring boot 使用DFA算法实现敏感词过滤
spring boot 使用DFA算法实现敏感词过滤 敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的. DFA算法简介 DFA全称为:Deterministi ...
- java dfa 敏感词_java利用DFA算法实现敏感词过滤功能
前言 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxoo相关的文字时)时要能检 测出来,很多项目中都会有一个敏感词管理模块,在敏感词管理模块中你可以加入敏感词,然 ...
- DFA算法进行敏感词过滤
1.新建敏感词文本new_adress.txt,进行添加敏感词 2.代码 # -*- coding:utf-8 -*- import timetime1 = time.time() "&qu ...
- DFA算法实现敏感词过滤
写项目时,得到一个新的需求,即实现敏感词的过滤,上网查了下,有几种实现方法,采取了DFA算法,即确定的有穷自动机算法,当初学习编译原理的时候为啥没想到DFA还能这么做,看来眼界和意识还是不够,得锻炼. ...
- dfa算法 java_Java实现DFA算法对敏感词、广告词过滤功能示例
一.前言 开发中经常要处理用户一些文字的提交,所以涉及到了敏感词过滤的功能,参考资料中DFA有穷状态机算法的实现,创建有向图.完成了对敏感词.广告词的过滤,而且效率较好,所以分享一下. 具体实现: 1 ...
- python实现dfa过滤算法_DFA 算法实现敏感词过滤(python 实现)
敏感词过滤的经典算法DFA ,看完相关资料后,自己实现了一下,同时做了评估实验 先上代码 #!/usr/bin/python2.6 # -*- coding: utf-8 -*- import tim ...
- TypeScript:Aho–Corasick算法实现敏感词过滤
敏感词过滤应该是许多后端同事经常会遇到的需求,无论是评论.弹幕.文章,都需要做敏感词过滤处理来规避风险.在前端开发中,使用replace函数来替换字符串是我们的常规操作,在这之前我思考过如果用Java ...
最新文章
- ti的硬件时钟和系统时钟同步
- react 错误边界_React with GraphQL和错误边界中的自定义错误页面
- Python入门篇-匿名函数
- ADO.NET与ADO
- php使用webuploader表单上传文件覆盖文件key doesn't match with scope的问题和解决思路
- SGU 109 Magic of David Copperfield II
- 实验问题总结与分享之DNS(Domain Name Server)
- Debian 9.6.0 + OpenMediaVault 4.x : U盘作系统盘时遇到的问题
- 重返数学史的黄金时代,由数学推动诞生的人工智能,一部人类智慧形成的历史
- 通过java.net.URLConnection发送HTTP请求
- javascript总结48:正则表达式(RegExp)
- JDBC10 Blob二进制对象
- 10 个 Python 项目简单又超有趣
- 使用bus hound发送包的方法
- 【渝粤题库】广东开放大学 标准化法律法规 形成性考核
- 2020年主流服务器主板,电脑主板怎么选(2020电脑主板选购指南及检测)
- AMA指标代码逐一解释,附源码(python)
- 科学计算机如何进行复数运算,教你如何用你的卡西欧学生计算器进行复数运算!...
- Spring MVC AOP切面失效原因与处理
- 如何用手机扫二维码盘点海量固定资产?
热门文章
- 用Multisim搭建三极管输出特性曲线及负载线产生电路
- 数据科学家成长指南(上)
- 二乘二(二阶)魔方教程,看完教程拼不出来我给你钱!
- 美团外卖数据采集接口
- 陈进: 创业维艰吗? 换个皮肤就能获批一亿经费!
- MATLAB高斯迭代算法,matlab实现高斯赛德尔迭代法解方程组
- 前端面试-面试官常见问题
- html代码替换正则:把lt;ssgt;lt;img src=quot;aquot; data=quot;bquot;gt;lt;/ssgt;换成lt;img src=b /gt;
- 频响函数和传递函数详解-工程实例
- html 显示闹钟,闹钟设置.html