返回

Go 语言实现敏感词检测(前缀树)

后端

在游戏、文章审核等风控场景中,敏感词检测至关重要。本文将深入探讨如何使用 Go 语言实现敏感词检测,并重点介绍前缀树这一高效的数据结构。

前缀树简介

前缀树(Trie 树)是一种树形数据结构,专门用于存储字符串。它通过共享前缀来实现高效的字符串搜索。前缀树的每个结点代表一个字符,而路径上的结点序列则代表一个字符串。

前缀树具有以下优点:

  • 快速查找: 通过逐个字符匹配,前缀树可以在 O(m) 时间内查找一个包含 m 个字符的字符串。
  • 空间效率: 前缀树共享公共前缀,因此可以节省存储空间。
  • 动态插入和删除: 前缀树支持动态插入和删除字符串,易于维护。

Go 语言实现

构建前缀树

type TrieNode struct {
    Char       rune
    IsEnd      bool
    Children   map[rune]*TrieNode
}

func NewTrieNode(char rune) *TrieNode {
    return &TrieNode{
        Char:     char,
        IsEnd:    false,
        Children: make(map[rune]*TrieNode),
    }
}

插入敏感词

func (trie *TrieNode) Insert(word string) {
    cur := trie

    for _, char := range word {
        if _, ok := cur.Children[char]; !ok {
            cur.Children[char] = NewTrieNode(char)
        }
        cur = cur.Children[char]
    }

    cur.IsEnd = true
}

敏感词检测

func (trie *TrieNode) Search(word string) bool {
    cur := trie

    for _, char := range word {
        if _, ok := cur.Children[char]; !ok {
            return false
        }
        cur = cur.Children[char]
    }

    return cur.IsEnd
}

实例

func main() {
    // 构建前缀树
    trie := NewTrieNode(0)
    trie.Insert("敏感词1")
    trie.Insert("敏感词2")
    trie.Insert("敏感词3")

    // 检测敏感词
    fmt.Println(trie.Search("敏感词1")) // true
    fmt.Println(trie.Search("敏感词2")) // true
    fmt.Println(trie.Search("敏感词3")) // true
    fmt.Println(trie.Search("无害词")) // false
}

总结

通过使用前缀树,我们可以高效地实现敏感词检测。Go 语言提供的便捷数据结构和强大的字符串处理能力,使得我们可以轻松构建和操作前缀树。