Trie性能分析之敏感词过滤golang
- package util
- import (
- "strings"
- )
- type Node struct {
- //rune表示一个utf8字符
- char rune
- Data interface{}
- parent *Node
- Depth int
- //childs 用来当前节点的所有孩子节点
- childs map[rune]*Node
- term bool
- }
- type Trie struct {
- root *Node
- size int
- }
- func NewNode() *Node {
- return &Node{
- childs: make(map[rune]*Node, ),
- }
- }
- func NewTrie() *Trie {
- return &Trie{
- root: NewNode(),
- }
- }
- //假如我要把 敏感词: “我操”
- // Add("我操", nil)
- // Add("色情片", nil)
- func (p *Trie) Add(key string, data interface{}) (err error) {
- key = strings.TrimSpace(key)
- node := p.root
- runes := []rune(key)
- for _, r := range runes {
- ret, ok := node.childs[r]
- if !ok {
- ret = NewNode()
- ret.Depth = node.Depth +
- ret.char = r
- node.childs[r] = ret
- }
- node = ret
- }
- node.term = true
- node.Data = data
- return
- }
- // findNode("色情片")
- func (p *Trie) findNode(key string) (result *Node) {
- node := p.root
- chars := []rune(key)
- for _, v := range chars {
- ret, ok := node.childs[v]
- if !ok {
- return
- }
- node = ret
- }
- result = node
- return
- }
- func (p *Trie) collectNode(node *Node) (result []*Node) {
- if node == nil {
- return
- }
- if node.term {
- result = append(result, node)
- return
- }
- var queue []*Node
- queue = append(queue, node)
- for i := ; i < len(queue); i++ {
- if queue[i].term {
- result = append(result, queue[i])
- continue
- }
- for _, v1 := range queue[i].childs {
- queue = append(queue, v1)
- }
- }
- return
- }
- func (p *Trie) PrefixSearch(key string) (result []*Node) {
- node := p.findNode(key)
- if node == nil {
- return
- }
- result = p.collectNode(node)
- return
- }
- // text = "我们都喜欢王八蛋"
- // replace = "***"
- func (p *Trie) Check(text, replace string) (result string, hit bool) {
- chars := []rune(text)
- if p.root == nil {
- return
- }
- var left []rune
- node := p.root
- start :=
- for index, v := range chars {
- ret, ok := node.childs[v]
- if !ok {
- left = append(left, chars[start:index+]...)
- start = index +
- node = p.root
- continue
- }
- node = ret
- if ret.term {
- hit = true
- node = p.root
- left = append(left, ([]rune(replace))...)
- start = index +
- continue
- }
- }
- result = string(left)
- return
- }
- package util
- import (
- "fmt"
- "testing"
- )
- func TestTrie(t *testing.T) {
- trie := NewTrie()
- trie.Add("黄色", nil)
- trie.Add("绿色", nil)
- trie.Add("蓝色", nil)
- result, str := trie.Check("我们这里有一个黄色的灯泡,他存在了很久。他是蓝色的。", "***")
- fmt.Printf("result:%#v, str:%v\n", result, str)
- }
Trie性能分析之敏感词过滤golang的更多相关文章
- [原创] Trie树 php 实现敏感词过滤
目录 背景 简介 存储结构 PHP 其他语言 字符串分割 示例代码 php 优化 缓存字典树 常驻服务 参考文章 背景 项目中需要过滤用户发送的聊天文本, 由于敏感词有将近2W条, 如果用 str_r ...
- DFA和trie特里实现敏感词过滤(python和c语言)
今天的项目是与完成python开展,需要使用做关键词检查,筛选分类,使用前c语言做这种事情.有了线索,非常高效,内存小了,检查快. 到达python在,第一个想法是pip基于外观的c语言python特 ...
- 转,敏感词过滤,PHP实现的Trie树
原文地址:http://blog.11034.org/2012-07/trie_in_php.html 项目需求,要做敏感词过滤,对于敏感词本身就是一个CRUD的模块很简单,比较麻烦的就是对各种输入的 ...
- [转载]敏感词过滤,PHP实现的Trie树
原文地址:http://blog.11034.org/2012-07/trie_in_php.html 项目需求,要做敏感词过滤,对于敏感词本身就是一个CRUD的模块很简单,比较麻烦的就是对各种输入的 ...
- 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)
转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...
- 用php实现一个敏感词过滤功能
周末空余时间撸了一个敏感词过滤功能,下边记录下实现过程. 敏感词,一方面是你懂的,另一方面是我们自己可能也要过滤一些人身攻击或者广告信息等,具体词库可以google下,有很多. 过滤敏感词,使用简单的 ...
- 浅析敏感词过滤算法(C++)
为了提高查找效率,这里将敏感词用树形结构存储,每个节点有一个map成员,其映射关系为一个string对应一个TreeNode. STL::map是按照operator<比较判断元素是否相同,以及 ...
- PHP实现敏感词过滤系统
PHP实现敏感词过滤系统 安装说明 安装PHP扩展 trie_filter,安装教程 http://blog.41ms.com/post/39.html 安装PHP扩展 swoole,安装教程 htt ...
- 敏感词过滤和XML的创建
今天我慢下来啦,因为这三天没有新的课程学习内容,自己仅仅看啦一些,这让我停下来栖息片刻:说说现在的生活,简单的进行着,每天要奔波着去上课,然后回来,每天都在想怎样学习这个小知识点,大脑也在想怎样解决程 ...
随机推荐
- csp-s模拟测试85
csp-s模拟测试85 $T1$全场秒切没有什么区分度,$T2$全场成功转化题意但是我并不会打,$T3$暴力都没打很遗憾. 100 00:21:49 02:56:35 02:56:49 135 02: ...
- 阿里云CentOs7上安装GitLab
一.安装 基本上可以根据官网的教程来安装:https://www.gitlab.com.cn/installation/#centos-7 只不过我们暂时没有邮件服务器,所以postfix没有安装. ...
- Collection、Iterator、泛型初步
java.util.Collection 集合层次的根接口 java.util.List extends Collection ArrayList implements List 常用方法 boole ...
- 第八篇:ZTree操作总结
花了一个多星期,终于完成了这个完整的功能,今天周五是时候总结下加深理解了. 项目要实现的功能:将树形目录发布到发布库,若是根目录,没有发布,连同自己和下面所有的子目录们全部发布:不是根目录,判断父目录 ...
- 19.SimLogin_case05
# 使用自造的cookies登录马蜂窝 import requests from lxml import etree str = 'mfw_uuid=5bcfcc20-b235-fbbe-c1d6-a ...
- LINUX挂接Windows文件共享
Windows网络共享的核心是SMB/CIFS,在linux下要挂接(mount)windows的磁盘共享,就必须安装和使用samba 软件包.现在流行的linux发行版绝大多数已经包含了samba软 ...
- 在github上怎样克隆vue项目及运行
长时间不做vue项目,今天看vue项目运行时有些指令忘记了,在这里写下相关指令 .克隆已有项目,一般情况项目中的README.md写的是项目运行步骤,一般项目的运行如下 克隆项目 git clone ...
- 用C++Builder在Windows开始按钮上绘图制作方法
熟悉Windows操作系统的软件设计人员知道,在Win95/98/NT/2000中有一任务栏(Task Bar)程序,路径为:C:\WINDOWS\SYSTEM\SYSTRAY.EXE(假设你的Win ...
- Hibernate(五)之一对多&多对一映射关系
既然我们讲到了一对多和多对一关系,必然要提到多表设计的问题.在开发中,前期需要进行需求分析,希求分析提供E-R图,根据ER图编写表结构. 我们知道表之间关系存在三种: 一对多&多对一:1表(主 ...
- Python学习day17-常用的一些模块
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...