python中哪些词是敏感字词_python实现敏感词过滤的几种方法
1.replace過(guò)濾
最簡(jiǎn)單也是最直接的就是直接循環(huán)敏感詞,然后使用replace過(guò)濾關(guān)鍵詞,文章和敏感詞少的時(shí)候還可以,多的時(shí)候效率就真的很一般了。
2.使用正則過(guò)濾
有兩個(gè)技術(shù)要點(diǎn),
1.使用Python正則表達(dá)式的re的sub()函數(shù);
2.在正則表達(dá)式語(yǔ)法中,豎線“|”表示二選一或多選一。
代碼參考
返回結(jié)果
3.DFA過(guò)濾敏感詞算法
在網(wǎng)上查了下敏感詞過(guò)濾方案,找到了一種名為DFA的算法,即Deterministic Finite Automaton算法,翻譯成中文就是確定有窮自動(dòng)機(jī)算法。它的基本思想是基于狀態(tài)轉(zhuǎn)移來(lái)檢索敏感詞,只需要掃描一次待檢測(cè)文本,就能對(duì)所有敏感詞進(jìn)行檢測(cè),所以效率比方案一高不少。
假設(shè)我們有以下5個(gè)敏感詞需要檢測(cè):傻逼、傻子、傻大個(gè)、壞蛋、壞人。那么我們可以先把敏感詞中有相同前綴的詞組合成一個(gè)樹(shù)形結(jié)構(gòu),不同前綴的詞分屬不同樹(shù)形分支,以上述5個(gè)敏感詞為例,可以初始化成如下2棵樹(shù):
image.png
image.png
把敏感詞組成成樹(shù)形結(jié)構(gòu)有什么好處呢?最大的好處就是可以減少檢索次數(shù),我們只需要遍歷一次待檢測(cè)文本,然后在敏感詞庫(kù)中檢索出有沒(méi)有該字符對(duì)應(yīng)的子樹(shù)就行了,如果沒(méi)有相應(yīng)的子樹(shù),說(shuō)明當(dāng)前檢測(cè)的字符不在敏感詞庫(kù)中,則直接跳過(guò)繼續(xù)檢測(cè)下一個(gè)字符;如果有相應(yīng)的子樹(shù),則接著檢查下一個(gè)字符是不是前一個(gè)字符對(duì)應(yīng)的子樹(shù)的子節(jié)點(diǎn),這樣迭代下去,就能找出待檢測(cè)文本中是否包含敏感詞了。
我們以文本“你是不是傻逼”為例,我們依次檢測(cè)每個(gè)字符,因?yàn)榍?個(gè)字符都不在敏感詞庫(kù)里,找不到相應(yīng)的子樹(shù),所以直接跳過(guò)。當(dāng)檢測(cè)到“傻”字時(shí),發(fā)現(xiàn)敏感詞庫(kù)中有相應(yīng)的子樹(shù),我們把他記為tree-1,接著再搜索下一個(gè)字符“逼”是不是子樹(shù)tree-1的子節(jié)點(diǎn),發(fā)現(xiàn)恰好是,接下來(lái)再判斷“逼”這個(gè)字符是不是葉子節(jié)點(diǎn),如果是,則說(shuō)明匹配到了一個(gè)敏感詞了,在這里“逼”這個(gè)字符剛好是tree-1的葉子節(jié)點(diǎn),所以成功檢索到了敏感詞:“傻逼”。大家發(fā)現(xiàn)了沒(méi)有,在我們的搜索過(guò)程中,我們只需要掃描一次被檢測(cè)文本就行了,而且對(duì)于被檢測(cè)文本中不存在的敏感詞,如這個(gè)例子中的“壞蛋”和“壞人”,我們完全不會(huì)掃描到,因此相比方案一效率大大提升了。
在python中,我們可以用dict來(lái)存儲(chǔ)上述的樹(shù)形結(jié)構(gòu),還是以上述敏感詞為例,我們把每個(gè)敏感詞字符串拆散成字符,再存儲(chǔ)到dict中,可以這樣存:
首先將每個(gè)詞的第一個(gè)字符作為key,value則是另一個(gè)dict,value對(duì)應(yīng)的dict的key為第二個(gè)字符,如果還有第三個(gè)字符,則存儲(chǔ)到以第二個(gè)字符為key的value中,當(dāng)然這個(gè)value還是一個(gè)dict,以此類推下去,直到最后一個(gè)字符,當(dāng)然最后一個(gè)字符對(duì)應(yīng)的value也是dict,只不過(guò)這個(gè)dict只需要存儲(chǔ)一個(gè)結(jié)束標(biāo)志就行了,像上述的例子中,我們就存了一個(gè){'\x00': 0}的dict,來(lái)表示這個(gè)value對(duì)應(yīng)的key是敏感詞的最后一個(gè)字符。
同理,“壞人”和“壞蛋”這2個(gè)敏感詞也是按這樣的方式存儲(chǔ)起來(lái),這里就不羅列出來(lái)了。
用dict存儲(chǔ)有什么好處呢?我們知道dict在理想情況下可以以O(shè)(1)的時(shí)間復(fù)雜度進(jìn)行查詢,所以我們?cè)诒闅v待檢測(cè)字符串的過(guò)程中,可以以O(shè)(1)的時(shí)間復(fù)雜度檢索出當(dāng)前字符是否在敏感詞庫(kù)中,效率比方案一提升太多了。
接下來(lái)上代碼。
sensitive_words.txt
運(yùn)行結(jié)果
4.AC自動(dòng)機(jī)過(guò)濾敏感詞算法
AC自動(dòng)機(jī):一個(gè)常見(jiàn)的例子就是給出n個(gè)單詞,再給出一段包含m個(gè)字符的文章,讓你找出有多少個(gè)單詞在文章里出現(xiàn)過(guò)。
簡(jiǎn)單地講,AC自動(dòng)機(jī)就是字典樹(shù)+kmp算法+失配指針
運(yùn)行結(jié)果
參考鏈接:
總結(jié)
以上是生活随笔為你收集整理的python中哪些词是敏感字词_python实现敏感词过滤的几种方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: zuulfilter添加例外_Sprin
- 下一篇: python字符串标签转化_如何在Ten