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的更多相关文章

  1. [原创] Trie树 php 实现敏感词过滤

    目录 背景 简介 存储结构 PHP 其他语言 字符串分割 示例代码 php 优化 缓存字典树 常驻服务 参考文章 背景 项目中需要过滤用户发送的聊天文本, 由于敏感词有将近2W条, 如果用 str_r ...

  2. DFA和trie特里实现敏感词过滤(python和c语言)

    今天的项目是与完成python开展,需要使用做关键词检查,筛选分类,使用前c语言做这种事情.有了线索,非常高效,内存小了,检查快. 到达python在,第一个想法是pip基于外观的c语言python特 ...

  3. 转,敏感词过滤,PHP实现的Trie树

    原文地址:http://blog.11034.org/2012-07/trie_in_php.html 项目需求,要做敏感词过滤,对于敏感词本身就是一个CRUD的模块很简单,比较麻烦的就是对各种输入的 ...

  4. [转载]敏感词过滤,PHP实现的Trie树

    原文地址:http://blog.11034.org/2012-07/trie_in_php.html 项目需求,要做敏感词过滤,对于敏感词本身就是一个CRUD的模块很简单,比较麻烦的就是对各种输入的 ...

  5. 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)

    转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...

  6. 用php实现一个敏感词过滤功能

    周末空余时间撸了一个敏感词过滤功能,下边记录下实现过程. 敏感词,一方面是你懂的,另一方面是我们自己可能也要过滤一些人身攻击或者广告信息等,具体词库可以google下,有很多. 过滤敏感词,使用简单的 ...

  7. 浅析敏感词过滤算法(C++)

    为了提高查找效率,这里将敏感词用树形结构存储,每个节点有一个map成员,其映射关系为一个string对应一个TreeNode. STL::map是按照operator<比较判断元素是否相同,以及 ...

  8. PHP实现敏感词过滤系统

    PHP实现敏感词过滤系统 安装说明 安装PHP扩展 trie_filter,安装教程 http://blog.41ms.com/post/39.html 安装PHP扩展 swoole,安装教程 htt ...

  9. 敏感词过滤和XML的创建

    今天我慢下来啦,因为这三天没有新的课程学习内容,自己仅仅看啦一些,这让我停下来栖息片刻:说说现在的生活,简单的进行着,每天要奔波着去上课,然后回来,每天都在想怎样学习这个小知识点,大脑也在想怎样解决程 ...

随机推荐

  1. Kmeans算法实现

    下面的demo是根据kmeans算法原理实现的demo,使用到的数据是kmeans.txt 1.658985 4.285136 -3.453687 3.424321 4.838138 -1.15153 ...

  2. 6_4.springboot2.x数据整合springData介绍

    介绍 Spring Data 项目的目的是为了简化构建基于Spring 框架应用的数据访问技术,包括非关系数据库.Map-Reduce 框架.云数据服务等等:另外也包含对关系数据库的访问支持. spr ...

  3. POJ 2318 /// 判断点与直线的位置关系

    题目大意: n块玩具箱隔板 m个玩具落地点 给定玩具箱的左上和右下两个端点 接下来给定n块隔板的上点的x和下点的x(因为y就是玩具箱的上下边缘) 接下来给定m个玩具落地点 输出n+1个区域各有的玩具数 ...

  4. typeerror: __init__() missing 2 required positional arguments: 'inputs' and 'outputs'

    1 问题描述 使用下边这条命令去检查 TensorFlow Object Detection API是否正确安装: python object_detection\builders\model_bui ...

  5. ajax无刷新上传

    我们在使用上传控件的时候,会遇到刷新的问题,最近使用ajax做的上传,觉得效果还是很不错. 首先,我们需要在页面上放上上传控件:需要注意的是,我们必须放在form里面,实现表单上传.  <for ...

  6. 2018-8-10-win10-uwp-打开文件管理器选择文件

    title author date CreateTime categories win10 uwp 打开文件管理器选择文件 lindexi 2018-08-10 19:16:50 +0800 2018 ...

  7. mysqldump使用记录

    #导出单个数据库:结构 无数据 [root@localhost ~]#mysqldump -h127.0.0.1 -uroot -p --opt --no-data db_name >~/db_ ...

  8. nodejs实现读取文件

    今天后端同事下班,想让我读取一个文件的内容.我想这个是小忙啊,就立马答应了. 我知道这个是nodejs读取,可是我又想,平时我们都要起一个服务才能够运行node服务器, 比如如下代码 var http ...

  9. thinkphp 组合查询

    组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string).复合查询(_complex).请求字符串查询(_query),混合查询中的特殊查询每次查询只能定 ...

  10. CF1163E Magical Permutation

    题意:给定集合,求一个最大的x,使得存在一个0 ~ 2x - 1的排列,满足每相邻的两个数的异或值都在S中出现过.Si <= 2e5 解:若有a,b,c,令S1 = a ^ b, S2 = b ...