Golang基于前缀树的敏感词过滤算法

我要割麦子 · · 1274 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一个简单的基于Golang的敏感词过滤算法

package main
import (
   "fmt"
 "unicode/utf8")
// 敏感词过滤
type Trie struct {
   child map[rune]*Trie
 word  string
}
// 插入
func (trie *Trie) insert(word string) *Trie {
   cur := trie
   for _, v := range []rune(word) {
      if _, ok := cur.child[v]; !ok {
         newTrie := NewTrie()
         cur.child[v] = newTrie
      }
      cur = cur.child[v]
   }
   cur.word = word
   return trie
}
// 过滤
func (trie *Trie) filerKeyWords(word string) string {
   cur := trie
   for i, v := range []rune(word) {
      if _, ok := cur.child[v]; ok {
         cur = cur.child[v]
         if cur.word != "" {
            word = replaceStr(word, "*", i-utf8.RuneCountInString(cur.word)+1, i)
            cur = trie
         }
      } else {
         cur = trie
      }
   }
   return word
}
func replaceStr(word string, replace string, left, right int) string {
   str := ""
 for i, v := range []rune(word) {
      if i >= left && i <= right {
         str += replace
      } else {
         str += string(v)
      }
   }
   return str
}
func NewTrie() *Trie {
   return &Trie{
      word:  "",
 child: make(map[rune]*Trie, 0),
 }
}
func main() {
   trie := NewTrie()
   trie.insert("sb").insert("狗日").insert("cnm").insert("狗日的")
   fmt.Println(trie.filerKeyWords("狗日,你就是个狗日的,我要cnm,你个sb,嘿嘿"))
}

image.png


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:我要割麦子

查看原文:Golang基于前缀树的敏感词过滤算法

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1274 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传