1. package util
  2.  
  3. import (
  4. "strings"
  5. )
  6.  
  7. type Node struct {
  8. //rune表示一个utf8字符
  9. char rune
  10. Data interface{}
  11. parent *Node
  12. Depth int
  13. //childs 用来当前节点的所有孩子节点
  14. childs map[rune]*Node
  15. term bool
  16. }
  17.  
  18. type Trie struct {
  19. root *Node
  20. size int
  21. }
  22.  
  23. func NewNode() *Node {
  24. return &Node{
  25. childs: make(map[rune]*Node, ),
  26. }
  27. }
  28.  
  29. func NewTrie() *Trie {
  30. return &Trie{
  31. root: NewNode(),
  32. }
  33. }
  34.  
  35. //假如我要把 敏感词: “我操”
  36. // Add("我操", nil)
  37. // Add("色情片", nil)
  38. func (p *Trie) Add(key string, data interface{}) (err error) {
  39.  
  40. key = strings.TrimSpace(key)
  41. node := p.root
  42. runes := []rune(key)
  43. for _, r := range runes {
  44. ret, ok := node.childs[r]
  45. if !ok {
  46. ret = NewNode()
  47. ret.Depth = node.Depth +
  48. ret.char = r
  49. node.childs[r] = ret
  50. }
  51.  
  52. node = ret
  53. }
  54.  
  55. node.term = true
  56. node.Data = data
  57. return
  58. }
  59.  
  60. // findNode("色情片")
  61. func (p *Trie) findNode(key string) (result *Node) {
  62.  
  63. node := p.root
  64. chars := []rune(key)
  65. for _, v := range chars {
  66. ret, ok := node.childs[v]
  67. if !ok {
  68. return
  69. }
  70.  
  71. node = ret
  72. }
  73.  
  74. result = node
  75. return
  76. }
  77.  
  78. func (p *Trie) collectNode(node *Node) (result []*Node) {
  79.  
  80. if node == nil {
  81. return
  82. }
  83.  
  84. if node.term {
  85. result = append(result, node)
  86. return
  87. }
  88.  
  89. var queue []*Node
  90. queue = append(queue, node)
  91.  
  92. for i := ; i < len(queue); i++ {
  93. if queue[i].term {
  94. result = append(result, queue[i])
  95. continue
  96. }
  97.  
  98. for _, v1 := range queue[i].childs {
  99. queue = append(queue, v1)
  100. }
  101. }
  102.  
  103. return
  104. }
  105.  
  106. func (p *Trie) PrefixSearch(key string) (result []*Node) {
  107.  
  108. node := p.findNode(key)
  109. if node == nil {
  110. return
  111. }
  112.  
  113. result = p.collectNode(node)
  114. return
  115. }
  116.  
  117. // text = "我们都喜欢王八蛋"
  118. // replace = "***"
  119. func (p *Trie) Check(text, replace string) (result string, hit bool) {
  120.  
  121. chars := []rune(text)
  122. if p.root == nil {
  123. return
  124. }
  125.  
  126. var left []rune
  127. node := p.root
  128. start :=
  129. for index, v := range chars {
  130. ret, ok := node.childs[v]
  131. if !ok {
  132. left = append(left, chars[start:index+]...)
  133. start = index +
  134. node = p.root
  135. continue
  136. }
  137.  
  138. node = ret
  139. if ret.term {
  140. hit = true
  141. node = p.root
  142. left = append(left, ([]rune(replace))...)
  143. start = index +
  144. continue
  145. }
  146. }
  147.  
  148. result = string(left)
  149. return
  150. }
  1. package util
  2.  
  3. import (
  4. "fmt"
  5. "testing"
  6. )
  7.  
  8. func TestTrie(t *testing.T) {
  9.  
  10. trie := NewTrie()
  11. trie.Add("黄色", nil)
  12. trie.Add("绿色", nil)
  13. trie.Add("蓝色", nil)
  14.  
  15. result, str := trie.Check("我们这里有一个黄色的灯泡,他存在了很久。他是蓝色的。", "***")
  16.  
  17. fmt.Printf("result:%#v, str:%v\n", result, str)
  18.  
  19. }

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. JavaScript中的表单编程

    表单编程 1获取表单相关信息 1.什么是表单元素 1.什么是表单元素 在H TML中表单就是指form标签,它的作用是将用户输入或选择的数据提交给指定的服务器 2.如何获取表单元素 <form ...

  2. Spark 读写数据、抽象转换 拾遗

    读 package com.test.spark import org.apache.spark.sql.{Dataset, Row, SaveMode, SparkSession} /** * @a ...

  3. 夏令营501-511NOIP训练17——蛇形矩阵

    传送门:QAQQAQ 题意:话说小X在孩提时,都会做标准的蛇形矩阵了,发现很好玩.现在的小X很想对其进行改版,变为如下类型的一个无限大蛇形数阵:令S(x)表示以1为左上角,x为右下角的矩形内所有数之和 ...

  4. 本地项目通过 git 同步到 github

    1. github创建仓库并克隆仓库地址 2. 在本地通过git命令:git clone <仓库地址> 生成github仓库文件夹 3. 将本地项目复制到该文件夹 4. 通过git命令:g ...

  5. <scrapy爬虫>scrapy命令行操作

    1.mysql数据库 2.mongoDB数据库 3.redis数据库 1.创建项目 scrapy startproject myproject cd myproject 2.创建爬虫 scrapy g ...

  6. 收藏的链接-Android

    我的Android进阶之旅------>Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法 - 欧阳鹏 - CSDN博客 https://blog.csdn.n ...

  7. Atcoder arc085

    C:HSI 期望模型,不想说. #include<cstdio> using namespace std; typedef long long ll; int main() { int n ...

  8. CodeForces-510D

    https://vjudge.net/problem/CodeForces-510D题目可以转化为花最小代价选一些数,然后这些数可以经过加减运算得到1或-1,不然1你就凑不出来,一旦凑出来1,其他的都 ...

  9. 廖雪峰Java14Java操作XML和JSON-2JSON-1Json介绍

    JSON是一种类似JavaScript对象的数据表示格式 JavaScript Object Notation 去除了JavaScript的执行语句 仅保留数据 JSON格式: 仅保留UTF-8编码 ...

  10. 模拟+贪心——cf1131E

    超级恶心的题,写了好久,直接倒序模拟做,但是网上有博客好像是直接正序dp做的.. 因为左端点和右端点是永远不会变的,然后情况要考虑全 /* 从后往前插 只要记录左连续,右连续,中间连续 左端点一定是L ...