通過Trie實現違禁詞過濾

2021-09-01 19:34:40 字數 2897 閱讀 8123

敏感詞過濾

生活在**的**,必須要有保持和諧的工具。根據**的規模不同選擇不同的技術方案:

1.前期上乙個敏感詞過濾系統,發的文章只要命中敏感詞就不讓發。

2.後期可以通過機器學習來自動識別一篇簡歷是否是正常簡歷,一篇正常簡歷的特徵還是很明顯的,通過訓練機器識別正常簡歷的語料,能讓機器自動判斷是否是違規資訊。

敏感詞過濾系統

比如檢測使用者輸入的一篇文章中是否含有網安給的違禁詞列表。現在正常的做法都是通過trie 樹來實現。trie 樹的基本原理基於這樣乙個事實:假設我從文字中查詢的單詞是abcd,那麼在他前面的單詞中,以b,c,d,f之類開頭的我顯然不必考慮。

以「中華人民」為例顯示在trie樹中字典的儲存結構:

上圖中每乙個節點都表示乙個trienode,每個trienode有乙個dict和val,root是乙個打平的dict,包含違禁詞中所有開頭的第乙個字。

比如詞典在文字中儲存格式是:

中華

中華書局

中華書庫

中華人民

國家國家專利

國家專利局

那麼root這個節點中dict的key包含['中','國']。

python的實現:

#!/usr/bin/python 

# -*- encoding: utf-8 -*-

import codecs

import time

class trienode:

def __init__ (self):

self.val = 0

self.trans = {}

class trie (object):

def __init__ (self):

self.root = trienode()

def __walk (self, trienode, ch):

if ch in trienode.trans:

trienode = trienode.trans[ch]

return trienode, trienode.val

else:

return none, 0

def add (self, word, value=1):

curr_node = self.root

for ch in word:

try:

curr_node = curr_node.trans[ch]

except:

curr_node.trans[ch] = trienode()

curr_node = curr_node.trans[ch]

curr_node.val = value

def _find_ch(self,curr_node,ch,word,start,limit):

curr_node, val = self.__walk (curr_node, ch)

if val:

return val

while curr_node is not none and start

start= start+1

ch = word[start]

curr_node, val = self.__walk (curr_node, ch)

if val:

return val

def match_all (self, word):

ret =

curr_node = self.root

index = 0

size = len(word)

while index

val = self._find_ch(curr_node,word[index], word, index, size)

if val:

index=index+1

return ret

class dict (trie):

def __init__(self, fname):

super (dict, self).__init__()

self.load(fname)

def load(self, fname):

file = codecs.open(fname, 'r', 'utf-8')

for line in file:

word = line.strip()

self.add(word, word)

file.close()

if __name__ == "__main__":

dic = dict("/home/yunpeng/test3/data/words-forbidden-1_.dic")

for x in range(100):

starttime = time.time()

test_str = u"大慶讓胡路喇嘛甸**有找小***186-5555-2557娜娜【qq1968454688空間選小姐】**有小***186-5555-2557【qq1968454688空間選小姐】**有小***186-5555-2557娜娜【qq1968454688空間看**】無論朋友你常住本市。。 **找小***娜娜【186-5555-2557娜娜】還是閣下才來我市。這些都不重要。。**找小***186-5555-2557娜娜因為找我們在寂寞的深夜你不在感到孤單和寂寞。。"

ret = dic.match_all(test_str)

endtime = time.time()

exe_time = (endtime - starttime)*1000

print "find forbidden %s cost:%s" %(" ".join(ret),exe_time)

聊天系統違禁詞過濾

網路遊戲作為一種多人互動遊戲,方便玩家在遊戲中交流是很重要的。為了防止玩家在遊戲中說違禁的東西,所有的聊天系統都需要對聊天資訊進行過濾。本文描述了一種簡單的基於dfa的演算法用於過濾聊天內容中的違禁詞,演算法的執行複雜度,遍歷 輸入字串n,最多對每個字元執行一次二分查詢lgn,所以最壞情況下也是o ...

Trie樹 髒詞過濾應用

當前的 還只是進行簡單的替換,並沒有做一些字元的處理,比如 昨天見到你媽,逼我要買房 這本身不是髒詞,因為有逗號,所以程式裡要增加字元的範圍判斷。程式中的skip就是用來過濾髒詞的簡單變體,比如 找 小 姐 預設是最多跳過3個字元,這個可以隨便調整了。總之是乙個trie的鍛鍊吧。public cla...

C 實現敏感詞過濾 2 Trie類的實現

三 trie類的定義 trie.h include include include trienode.h class trie else else it second return result std string trie getkeywords std string result for tr...