最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Go語(yǔ)言實(shí)現(xiàn)敏感詞過(guò)濾功能

 更新時(shí)間:2023年12月18日 08:26:14   作者:郭強(qiáng)112  
敏感詞過(guò)濾,算是一個(gè)比較常見(jiàn)的功能,尤其是在內(nèi)容、社交類應(yīng)用中更是如此,本文介紹如何使用Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的敏感詞過(guò)濾功能,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下

簡(jiǎn)單敏感詞過(guò)濾-ai版

先列出一個(gè)gpt給出來(lái)的一個(gè)簡(jiǎn)單前綴樹的實(shí)現(xiàn):

// 初始化敏感詞切片
var sensitiveWords = []string{}

// TrieNode 表示Trie樹的節(jié)點(diǎn)
type TrieNode struct {
	children map[rune]*TrieNode
	isEnd    bool
	Text     string
}

// Trie 表示敏感詞的Trie樹
type Trie struct {
	root *TrieNode
}

// NewTrie 創(chuàng)建一個(gè)新的Trie樹
func NewTrie() *Trie {
	return &Trie{
		root: &TrieNode{
			children: make(map[rune]*TrieNode),
			isEnd:    false,
		},
	}
}

// Insert 將一個(gè)敏感詞插入到Trie樹中
func (t *Trie) Insert(word string) {
	node := t.root
	for _, char := range []rune(word) {
		if _, ok := node.children[char]; !ok {
			node.children[char] = &TrieNode{
				children: make(map[rune]*TrieNode),
				isEnd:    false,
			}
		}
		node = node.children[char]
	}

	node.Text = word
	node.isEnd = true
}

// Contains 檢測(cè)文本中是否包含敏感詞
func (t *Trie) Contains(text string) bool {
	node := t.root
	for _, char := range []rune(text) {
		if _, ok := node.children[char]; !ok {
			continue
		}
		node = node.children[char]
		if node.isEnd {
			return true
		}
	}
	return false
}

這個(gè)版本的代碼中,構(gòu)建了一個(gè)簡(jiǎn)單的前綴樹來(lái)存儲(chǔ)敏感詞,如果某個(gè)節(jié)點(diǎn)存儲(chǔ)的是敏感詞的最后一個(gè)字符,則isEnd值為true。這樣,當(dāng)我們檢測(cè)到某個(gè)節(jié)點(diǎn)的isEnd值為true時(shí),就說(shuō)明檢測(cè)到了敏感詞。

如果只是為了檢測(cè)到一段文本是否包含敏感詞,而不需要匹配出所有的敏感詞,那實(shí)際上在敏感詞a包含敏感詞b時(shí),我們可以只存儲(chǔ)單詞b。

我們編寫一個(gè)測(cè)試用例,測(cè)試一下上面的代碼:

func TestCheckWord1(t *testing.T) {
	trie := NewTrie()
	for _, word := range sensitiveWords {
		trie.Insert(word)
	}

	content := "這里是一段非法活動(dòng)文本。"

	search := trie.Contains(content)

	assert.Equal(t, search, true)
}

測(cè)試結(jié)果如下:

測(cè)試通過(guò)。(再這樣下去程序員真要失業(yè)了?。?/p>

當(dāng)然,上面的代碼不完善,例如:不是并發(fā)安全的、不支持刪除敏感詞、沒(méi)有返回檢測(cè)到的敏感詞。我們來(lái)完善一下。

完善敏感詞過(guò)濾

下面我們?cè)谏厦娴拇a基礎(chǔ)上,添加一些功能。

package sensitivewordcheck

import "sync"

// TrieV1Node 表示TrieV1樹的節(jié)點(diǎn)
type TrieV1Node struct {
	children map[rune]*TrieV1Node // 子節(jié)點(diǎn)
	isEnd    bool
	Text     string
	Value    rune
	parent   *TrieV1Node // 父節(jié)點(diǎn)
}

// TrieV1 表示敏感詞的TrieV1樹
type TrieV1 struct {
	root *TrieV1Node
	lock sync.RWMutex
}

// NewTrieV1 創(chuàng)建一個(gè)新的TrieV1樹
func NewTrieV1() *TrieV1 {
	return &TrieV1{
		root: &TrieV1Node{
			children: make(map[rune]*TrieV1Node),
			isEnd:    false,
		},
	}
}

// Insert 將一個(gè)敏感詞插入到TrieV1樹中
func (t *TrieV1) Insert(word string) {
	t.lock.Lock()
	defer t.lock.Unlock()

	node := t.root
	for _, char := range []rune(word) {
		if _, ok := node.children[char]; !ok {
			node.children[char] = &TrieV1Node{
				children: make(map[rune]*TrieV1Node),
				isEnd:    false,
				parent:   node,
				Value:    char,
			}
		}
		node = node.children[char]
	}

	node.Text = word
	node.isEnd = true
}

// Contains 檢測(cè)文本中是否包含敏感詞
func (t *TrieV1) Contains(text string) bool {
	t.lock.RLock()
	defer t.lock.RUnlock()

	node := t.root
	for _, char := range []rune(text) {
		if _, ok := node.children[char]; !ok {
			continue
		}
		node = node.children[char]
		if node.isEnd {
			return true
		}
	}
	return false
}

// Check 檢測(cè)文本中是否包含敏感詞,并返回第一個(gè)敏感詞
func (t *TrieV1) Check(text string) string {
	t.lock.RLock()
	defer t.lock.RUnlock()

	node := t.root
	for _, char := range text {
		if _, ok := node.children[char]; !ok {
			continue
		}
		node = node.children[char]
		if node.isEnd {
			return node.Text
		}
	}

	return ""
}

// Rebuild 重新構(gòu)建敏感詞樹
func (t *TrieV1) Rebuild(words []string) {
	t.lock.Lock()
	defer t.lock.Unlock()

	t.root = &TrieV1Node{}

	for _, word := range words {
		t.Insert(word)
	}
}

// Delete 刪除一個(gè)敏感詞
func (t *TrieV1) Delete(word string) {
	t.lock.Lock()
	defer t.lock.Unlock()

	node := t.root

	for _, char := range []rune(word) {
		if _, ok := node.children[char]; !ok {
			return
		}
		node = node.children[char]

		if node.isEnd {
			node.isEnd = false
			node.Text = ""

			if len(node.children) > 0 { // 有子節(jié)點(diǎn),不能刪除
				break
			}

			// 遞歸刪除
			t.doDel(node)
		}

	}
}

func (t *TrieV1) doDel(node *TrieV1Node) {
	// 再次判斷是否可以刪除
	if node == nil || len(node.children) > 0 {
		return
	}

	// 從上級(jí)節(jié)點(diǎn)的children中刪除本節(jié)點(diǎn)
	delete(node.parent.children, node.Value)

	// 判斷上一層節(jié)點(diǎn)是否可以刪除
	t.doDel(node.parent)
}

在上面的版本中,我們添加了讀寫鎖來(lái)保證并發(fā)安全,并且添加了刪除敏感詞的功能。

敏感詞庫(kù)的變更,是一個(gè)并不頻繁的操作,而可以預(yù)見(jiàn)的時(shí),敏感詞庫(kù)不會(huì)太大。所以,我們是否可以在敏感詞庫(kù)發(fā)生變更時(shí),直接重構(gòu)整個(gè)敏感詞庫(kù),在重構(gòu)完成后,再切換到新的敏感詞庫(kù)上呢?

測(cè)試代碼:

package sensitivewordcheck

import (
	"github.com/stretchr/testify/assert"
	"testing"
)

var trieV1 *TrieV1

func init() {
	trieV1 = NewTrieV1()
	for _, word := range sensitiveWords {
		trieV1.Insert(word)
	}
}

func TestCheckWordAndDelete(t *testing.T) {

	// 添加敏感詞 非法捕魚
	trieV1.Insert("非法捕魚")

	assert.Equal(t, trieV1.Contains("你要去非法捕魚嗎?"), true)

	// 添加敏感詞 非法打獵
	trieV1.Insert("非法打獵")

	assert.Equal(t, trieV1.Contains("你要去非法打獵嗎?"), true)

	// 刪除敏感詞 非法打獵
	trieV1.Delete("非法打獵")

	// 不再包含 非法打獵
	assert.Equal(t, trieV1.Contains("你要去非法打獵嗎?"), false)

	// 非法捕魚 不受影響
	assert.Equal(t, trieV1.Contains("你要去非法捕魚嗎?"), true)

	// 更長(zhǎng)的敏感詞
	trieV1.Insert("非法捕魚工具")
	assert.Equal(t, trieV1.Contains("你要去買非法捕魚工具嗎?"), true)

	// 刪除 非法捕魚
	trieV1.Delete("非法捕魚")
	assert.Equal(t, trieV1.Contains("你要去非法捕魚嗎?"), false)
	// 如果有子節(jié)點(diǎn),不刪除
	assert.Equal(t, trieV1.Contains("你要去買非法捕魚工具嗎?"), true)

}

上面的測(cè)試用例中,我們添加了添加、刪除敏感詞功能,并校驗(yàn)了刪除敏感詞的正確性,以及在有更長(zhǎng)的敏感詞時(shí)是否會(huì)無(wú)刪除。 上述用例在本機(jī)測(cè)試通過(guò)。

后記

以上,我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的敏感詞過(guò)濾功能。實(shí)際上,敏感詞過(guò)濾還可以做得更復(fù)雜,添加更多功能,比如,檢測(cè)拼音、過(guò)濾特殊字符等等。這些功能,可以在上面的代碼基礎(chǔ)上,自行擴(kuò)展。但是需要考慮的是:擴(kuò)展功能的同時(shí),是否會(huì)影響性能,尤其是在檢測(cè)超長(zhǎng)文本時(shí)。

到此這篇關(guān)于使用Go語(yǔ)言實(shí)現(xiàn)敏感詞過(guò)濾功能的文章就介紹到這了,更多相關(guān)Go敏感詞過(guò)濾內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文詳解Golang中的基礎(chǔ)語(yǔ)法

    一文詳解Golang中的基礎(chǔ)語(yǔ)法

    這篇文章主要為大家詳細(xì)介紹了Golang中基礎(chǔ)語(yǔ)法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Golang有一定的幫助,感興趣的可以了解一下
    2023-03-03
  • go各種import的使用方法講解

    go各種import的使用方法講解

    今天小編就為大家分享一篇關(guān)于go各種import的使用方法講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • GoLang抽獎(jiǎng)系統(tǒng)簡(jiǎn)易實(shí)現(xiàn)流程

    GoLang抽獎(jiǎng)系統(tǒng)簡(jiǎn)易實(shí)現(xiàn)流程

    這篇文章主要介紹了GoLang抽獎(jiǎng)系統(tǒng)實(shí)現(xiàn)流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-12-12
  • 詳解Go微服務(wù)容錯(cuò)設(shè)計(jì)(熔斷+降級(jí)+限流全解析)

    詳解Go微服務(wù)容錯(cuò)設(shè)計(jì)(熔斷+降級(jí)+限流全解析)

    本文概述了Go微服務(wù)容錯(cuò)設(shè)計(jì),包括超時(shí)控制、重試機(jī)制、熔斷機(jī)制和降級(jí)策略,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • Go+Redis實(shí)現(xiàn)延遲隊(duì)列實(shí)操

    Go+Redis實(shí)現(xiàn)延遲隊(duì)列實(shí)操

    這篇文章主要介紹了Go+Redis實(shí)現(xiàn)延遲隊(duì)列實(shí)操,延遲隊(duì)列是一種非常使用的數(shù)據(jù)結(jié)構(gòu),我們經(jīng)常有需要延遲推送處理消息的場(chǎng)景,比如延遲60秒發(fā)送短信,延遲30分鐘關(guān)閉訂單,消息消費(fèi)失敗延遲重試等
    2022-09-09
  • Go語(yǔ)言題解LeetCode463島嶼的周長(zhǎng)示例詳解

    Go語(yǔ)言題解LeetCode463島嶼的周長(zhǎng)示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言題解LeetCode463島嶼的周長(zhǎng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 淺析Golang開發(fā)中g(shù)oroutine的正確使用姿勢(shì)

    淺析Golang開發(fā)中g(shù)oroutine的正確使用姿勢(shì)

    很多初級(jí)的Gopher在學(xué)習(xí)了goroutine之后,在項(xiàng)目中其實(shí)使用率不高,所以這篇文章小編主要來(lái)帶大家深入了解一下goroutine的常見(jiàn)使用方法,希望對(duì)大家有所幫助
    2024-03-03
  • Golang 中 omitempty的作用

    Golang 中 omitempty的作用

    這篇文章主要介紹了Golang 中 omitempty的作用,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考一下,需要的小伙伴可以參考一下
    2022-07-07
  • 解析Go?中的?rune?類型

    解析Go?中的?rune?類型

    rune類型是?Go?語(yǔ)言的一種特殊數(shù)字類型,Go?語(yǔ)言通過(guò)rune處理中文,支持國(guó)際化多語(yǔ)言,本文給大家介紹Go?中的?rune?類型,感興趣的朋友一起看看吧
    2022-03-03
  • 詳解go語(yǔ)言中type關(guān)鍵詞的幾種使用

    詳解go語(yǔ)言中type關(guān)鍵詞的幾種使用

    這篇文章主要介紹了詳解go語(yǔ)言中type的幾種使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評(píng)論

肥城市| 桐梓县| 满城县| 凤台县| 永寿县| 天水市| 宁夏| 奉新县| 海晏县| 高州市| 达州市| 新绛县| 保山市| 怀化市| 彩票| 桂阳县| 营口市| 海南省| 泽库县| 乌审旗| 北辰区| 台安县| 广水市| 呈贡县| 屏东市| 台湾省| 西贡区| 托里县| 龙游县| 河南省| 靖安县| 赣州市| 海安县| 长海县| 唐海县| 页游| 共和县| 洛隆县| 察隅县| 衡南县| 平江县|