您现在的位置是:首页 > 编程

go实现敏感词过滤

编程作者:go高级工程师日期:2022-03-04 15:36:49点击:281

敏感词过滤,提前将敏感词设置好,然后每次有新句子都要过滤一遍,若存在敏感词,则用*号代替,代码如下

  1. package main
  2. import (
  3. "fmt"
  4. "unicode/utf8"
  5. )
  6. type Trie struct {
  7. child map[rune]*Trie
  8. word string
  9. }
  10. func NewTrie() *Trie {
  11. return &Trie{
  12. child: make(map[rune]*Trie),
  13. word: "",
  14. }
  15. }
  16. func (trie *Trie) insert(word string) *Trie {
  17. cur := trie
  18. for _, v := range []rune(word) {
  19. // 若存在,不做处理,若不存在,创建新的子树
  20. if _, ok := cur.child[v]; !ok {
  21. t := NewTrie()
  22. cur.child[v] = t
  23. }
  24. cur = cur.child[v]
  25. }
  26. cur.word = word
  27. return trie
  28. }
  29. func (trie *Trie) filterString(word string) string {
  30. cur := trie
  31. for i, v := range []rune(word) {
  32. if _, ok := cur.child[v]; ok {
  33. cur = cur.child[v]
  34. if cur.word != "" {
  35. word = replaceStr(word, "*", i+1-utf8.RuneCountInString(cur.word), i)
  36. cur = trie // ,符合条件,从头开始准备下一次遍历
  37. }
  38. } else {
  39. cur = trie // 不存在,则从头遍历
  40. }
  41. }
  42. return word
  43. }
  44. func replaceStr(word, replace string, left, right int) string {
  45. str := ""
  46. for i, v := range []rune(word) {
  47. if i >= left && i <= right {
  48. str = str + replace
  49. } else {
  50. str += string(v)
  51. }
  52. }
  53. return str
  54. }
  55. func main() {
  56. trie := NewTrie()
  57. trie.insert("sb").insert("狗日").insert("cnm").insert("狗日的").insert("c").insert("nm")
  58. fmt.Println(trie.filterString("狗头,你就是个狗日的,我要cnm,你个sb,嘿嘿"))
  59. }

文章评论