<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
DFA 演演算法是通過提前構造出一個 樹狀查詢結構,之後根據輸入在該樹狀結構中就可以進行非常高效的查詢。
設我們有一個敏感詞庫,詞酷中的詞彙為:
那麼就可以構造出這樣的樹狀結構:
設玩家輸入的字串為:白菊我愛你呀哈哈哈
我們遍歷玩家輸入的字串 str,並設指標 i 指向樹狀結構的根節點,即最左邊的空白節點:
此時,我們的指標 i 已經指向了樹狀結構的末尾,即此時已經完成了一次敏感詞判斷。我們可以用變數來記錄下這次敏感詞匹配開始時玩家輸入字串的下標,和匹配結束時的下標,然後再遍歷一次將字元替換為 * 即可。
結束一次匹配後,我們把指標 i 重新指向樹狀結構的根節點處。
此時我們玩家輸入的字串還沒有遍歷到頭,所以繼續遍歷:
str[6] = ‘哈’,不滿足匹配條件,繼續遍歷
str[7] = ‘哈’ …
str[8] = ‘哈’ …
可以看出我們遍歷了一次玩家輸入的字串,就找到了其中的敏感詞彙。
DFA演演算法python實現
class DFA: """DFA 演演算法 敏感字中「*」代表任意一個字元 """ def __init__(self, sensitive_words: list, skip_words: list): # 對於敏感詞sensitive_words及無意義的詞skip_words可以通過資料庫、檔案或者其他儲存媒介進行儲存 self.state_event_dict = self._generate_state_event(sensitive_words) self.skip_words = skip_words def __repr__(self): return '{}'.format(self.state_event_dict) @staticmethod def _generate_state_event(sensitive_words) -> dict: state_event_dict = {} for word in sensitive_words: tmp_dict = state_event_dict length = len(word) for index, char in enumerate(word): if char not in tmp_dict: next_dict = {'is_end': False} tmp_dict[char] = next_dict tmp_dict = next_dict else: next_dict = tmp_dict[char] tmp_dict = next_dict if index == length - 1: tmp_dict['is_end'] = True return state_event_dict def match(self, content: str): match_list = [] state_list = [] temp_match_list = [] for char_pos, char in enumerate(content): if char in self.skip_words: continue if char in self.state_event_dict: state_list.append(self.state_event_dict) temp_match_list.append({ "start": char_pos, "match": "" }) for index, state in enumerate(state_list): is_match = False state_char = None if '*' in state: # 對於一些敏感詞,比如大傻X,可能是大傻B,大傻×,大傻...,採用萬用字元*,一個*代表一個字元 state_list[index] = state['*'] state_char = state['*'] is_match = True if char in state: state_list[index] = state[char] state_char = state[char] is_match = True if is_match: if state_char["is_end"]: stop = char_pos + 1 temp_match_list[index]['match'] = content[ temp_match_list[index]['start']:stop] match_list.append(copy.deepcopy(temp_match_list[index])) if len(state_char.keys()) == 1: state_list.pop(index) temp_match_list.pop(index) else: state_list.pop(index) temp_match_list.pop(index) for index, match_words in enumerate(match_list): print(match_words['start']) return match_list
_generate_state_event方法生成敏感詞的樹狀結構,(以字典儲存),對於上面的例子,生成的樹狀結構儲存如下:
if __name__ == '__main__': dfa = DFA(['我愛你', '我愛他', '我愛她', '我愛你呀', '我愛他呀', '我愛她呀', '我愛她啊'], skip_words=[]) # 暫時不設定skip_words print(dfa)
結果:
{'我': {'is_end': False, '愛': {'is_end': False, '你': {'is_end': True, '呀': {'is_end': True}}, '他': {'is_end': True, '呀': {'is_end': True}}, '她': {'is_end': True, '呀': {'is_end': True}, '啊': {'is_end': True}}}}}
然後呼叫match方法,輸入內容進行敏感詞匹配:
if __name__ == '__main__': dfa = DFA(['我愛你', '我愛他', '我愛她', '我愛你呀', '我愛他呀', '我愛她呀', '我愛她啊'], ['n', 'rn', 'r']) # print(dfa) print(dfa.match('白菊我愛你呀哈哈哈'))
結果:
[{'start': 2, 'match': '我愛你'}, {'start': 2, 'match': '我愛你呀'}]
而對於一些敏感詞,比如大傻X,可能是大傻B,大傻×,大傻...,那是不是可以通過一個萬用字元*來解決?
見程式碼:48 ~51行
if '*' in state: # 對於一些敏感詞,比如大傻X,可能是大傻B,大傻×,大傻...,採用萬用字元*,一個*代表一個字元 state_list[index] = state['*'] state_char = state['*'] is_match = True
驗證一下:
if __name__ == '__main__': dfa = DFA(['大傻*'], []) print(dfa) print(dfa.match('大傻X安樂飛大傻B'))
{'大': {'is_end': False, '傻': {'is_end': False, '*': {'is_end': True}}}}
[{'start': 0, 'match': '大傻X'}, {'start': 6, 'match': '大傻B'}]
上列中如果輸入的內容中,“大傻X安樂飛大傻B”寫成“大%傻X安樂飛大&傻B”,看看是否能識別出敏感詞呢?識別不出了!
if __name__ == '__main__': dfa = DFA(['大傻*'], []) print(dfa) print(dfa.match('大%傻X安樂飛大&傻B'))
結果:
{'大': {'is_end': False, '傻': {'is_end': False, '*': {'is_end': True}}}}
[
諸如“,&,!,!,@,#,$,¥,*,^,%,?,?,<,>,《,》",這些特殊符號無實際意義,但是可以在敏感詞中間插入而破壞敏感詞的結構規避敏感詞檢查
進行無意義詞設定,再進行敏感詞檢查,如下,可見對於被破壞的敏感詞也能識別
if __name__ == '__main__': dfa = DFA(['大傻*'], ['%', '&']) print(dfa) print(dfa.match('大%傻X安樂飛大&傻B'))
結果:
{'大': {'is_end': False, '傻': {'is_end': False, '*': {'is_end': True}}}}
[{'start': 0, 'match': '大%傻X'}, {'start': 7, 'match': '大&傻B'}]
以上就是Python基於DFA演演算法實現內容敏感詞過濾的詳細內容,更多關於Python敏感詞過濾的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45