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. 缓冲(cache)和缓存(buffer)

    缓存: 指把常用数据存储到可以快速获取的区域,以备重复利用 一般叫做cache. 缓存能提高效率 缓冲: 是指在数据流转过程中,不同层次速度不一致时,利用缓冲区来缓解上下层之间速率问题(性能差异) 一 ...

  2. day 58 Django基础六之ORM中的锁和事务

      Django基础六之ORM中的锁和事务   本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update( ...

  3. webpack用了manifest为何还是每次都生成新的vendor?

    原来的代码 //用于提取公共代码 new webpack.optimize.CommonsChunkPlugin({ //记得要在开头引入webpack names: ['vendor','manif ...

  4. java中的Math类

    一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double 等 在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形.为了解决这个问题,Ja ...

  5. [转]使用TortoiseGit处理代码冲突

    场景一  user0 有新提交 user1 没有pull -> 写新代码 -> pull -> 提示有冲突   解决办法一 -> stash save(把自己的代码隐藏存起来) ...

  6. 使用Cookie实现用户商品历史浏览记录

    该功能分为四个模块: 1. 获取所有商品并以链接的形式显示 out.write("网站商品: <br/>"); Map<String, Book> book ...

  7. 【五校联考5day1】登山

    题目 描述 题目大意 给你一个n∗nn*nn∗n的网格图.从(0,0)(0,0)(0,0)开始,每次只可以向右或向上移动一格,并且不能越过对角线(即不能为x<yx<yx<y). 网格 ...

  8. vs Code打开新的文件会覆盖窗口中的文件?

    这是因为你单击文件名的缘故,这个是“预览模式”,所以再单击其他文件时,会覆盖当前打开的文件. 如果你要每次都打开新tab,那就双击文件名好了.这个逻辑和sublime是一样的. 补充: 预览模式是现在 ...

  9. 莫烦pytorch学习笔记(一)——torch or numpy

    Q1:什么是神经网络? Q2:torch vs numpy Numpy:NumPy系统是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(neste ...

  10. Laravel 不同环境加载不同的.env文件

    假设有4个.env文件.分别为 .env.local .env.dev .env.test .env.prd 方式一 第一步:bootstrap\app.php 加入代码 $envs = ['loca ...