簡述:
關于敏感詞過濾可以看成是一種文本反垃圾算法,例如
題目:敏感詞文本文件 filtered_words.txt,當用戶輸入敏感詞語,則用 星號 * 替換,例如當用戶輸入「北京是個好城市」,則變成「**是個好城市」
代碼:
#coding=utf-8
def filterwords(x):
with open(x,'r') as f:
text=f.read()
print text.split('\n')
userinput=raw_input('myinput:')
for i in text.split('\n'):
if i in userinput:
replace_str='*'*len(i.decode('utf-8'))
word=userinput.replace(i,replace_str)
return word
print filterwords('filtered_words.txt')
再例如反黃系列:
開發敏感詞語過濾程序,提示用戶輸入評論內容,如果用戶輸入的內容中包含特殊的字符:
敏感詞列表 li = ["蒼老師","東京熱",”武藤蘭”,”波多野結衣”]
則將用戶輸入的內容中的敏感詞匯替換成***,并添加到一個列表中;如果用戶輸入的內容沒有敏感詞匯,則直接添加到上述的列表中。
content = input('請輸入你的內容:')
li = ["蒼老師","東京熱","武藤蘭","波多野結衣"]
i = 0
while i 4:
for li[i] in content:
li1 = content.replace('蒼老師','***')
li2 = li1.replace('東京熱','***')
li3 = li2.replace('武藤蘭','***')
li4 = li3.replace('波多野結衣','***')
else:
pass
i += 1

實戰案例:
一道bat面試題:快速替換10億條標題中的5萬個敏感詞,有哪些解決思路?
有十億個標題,存在一個文件中,一行一個標題。有5萬個敏感詞,存在另一個文件。寫一個程序過濾掉所有標題中的所有敏感詞,保存到另一個文件中。
1、DFA過濾敏感詞算法
在實現文字過濾的算法中,DFA是比較好的實現算法。DFA即Deterministic Finite Automaton,也就是確定有窮自動機。
算法核心是建立了以敏感詞為基礎的許多敏感詞樹。
python 實現DFA算法:
# -*- coding:utf-8 -*-
import time
time1=time.time()
# DFA算法
class DFAFilter():
def __init__(self):
self.keyword_chains = {}
self.delimit = '\x00'
def add(self, keyword):
keyword = keyword.lower()
chars = keyword.strip()
if not chars:
return
level = self.keyword_chains
for i in range(len(chars)):
if chars[i] in level:
level = level[chars[i]]
else:
if not isinstance(level, dict):
break
for j in range(i, len(chars)):
level[chars[j]] = {}
last_level, last_char = level, chars[j]
level = level[chars[j]]
last_level[last_char] = {self.delimit: 0}
break
if i == len(chars) - 1:
level[self.delimit] = 0
def parse(self, path):
with open(path,encoding='utf-8') as f:
for keyword in f:
self.add(str(keyword).strip())
def filter(self, message, repl="*"):
message = message.lower()
ret = []
start = 0
while start len(message):
level = self.keyword_chains
step_ins = 0
for char in message[start:]:
if char in level:
step_ins += 1
if self.delimit not in level[char]:
level = level[char]
else:
ret.append(repl * step_ins)
start += step_ins - 1
break
else:
ret.append(message[start])
break
else:
ret.append(message[start])
start += 1
return ''.join(ret)
if __name__ == "__main__":
gfw = DFAFilter()
path="F:/文本反垃圾算法/sensitive_words.txt"
gfw.parse(path)
text="新疆騷亂蘋果新品發布會雞八"
result = gfw.filter(text)
print(text)
print(result)
time2 = time.time()
print('總共耗時:' + str(time2 - time1) + 's')
運行效果:
新疆騷亂蘋果新品發布會雞八
****蘋果新品發布會**
總共耗時:0.0010344982147216797s
2、AC自動機過濾敏感詞算法
AC自動機:一個常見的例子就是給出n個單詞,再給出一段包含m個字符的文章,讓你找出有多少個單詞在文章里出現過。
簡單地講,AC自動機就是字典樹+kmp算法+失配指針
# -*- coding:utf-8 -*-
import time
time1=time.time()
# AC自動機算法
class node(object):
def __init__(self):
self.next = {}
self.fail = None
self.isWord = False
self.word = ""
class ac_automation(object):
def __init__(self):
self.root = node()
# 添加敏感詞函數
def addword(self, word):
temp_root = self.root
for char in word:
if char not in temp_root.next:
temp_root.next[char] = node()
temp_root = temp_root.next[char]
temp_root.isWord = True
temp_root.word = word
# 失敗指針函數
def make_fail(self):
temp_que = []
temp_que.append(self.root)
while len(temp_que) != 0:
temp = temp_que.pop(0)
p = None
for key,value in temp.next.item():
if temp == self.root:
temp.next[key].fail = self.root
else:
p = temp.fail
while p is not None:
if key in p.next:
temp.next[key].fail = p.fail
break
p = p.fail
if p is None:
temp.next[key].fail = self.root
temp_que.append(temp.next[key])
# 查找敏感詞函數
def search(self, content):
p = self.root
result = []
currentposition = 0
while currentposition len(content):
word = content[currentposition]
while word in p.next == False and p != self.root:
p = p.fail
if word in p.next:
p = p.next[word]
else:
p = self.root
if p.isWord:
result.append(p.word)
p = self.root
currentposition += 1
return result
# 加載敏感詞庫函數
def parse(self, path):
with open(path,encoding='utf-8') as f:
for keyword in f:
self.addword(str(keyword).strip())
# 敏感詞替換函數
def words_replace(self, text):
"""
:param ah: AC自動機
:param text: 文本
:return: 過濾敏感詞之后的文本
"""
result = list(set(self.search(text)))
for x in result:
m = text.replace(x, '*' * len(x))
text = m
return text
if __name__ == '__main__':
ah = ac_automation()
path='F:/文本反垃圾算法/sensitive_words.txt'
ah.parse(path)
text1="新疆騷亂蘋果新品發布會雞八"
text2=ah.words_replace(text1)
print(text1)
print(text2)
time2 = time.time()
print('總共耗時:' + str(time2 - time1) + 's')
運行結果:
新疆騷亂蘋果新品發布會雞八
****蘋果新品發布會**
總共耗時:0.0010304450988769531s
以上就是python實現過濾敏感詞的詳細內容,更多關于python 過濾敏感詞的資料請關注腳本之家其它相關文章!
您可能感興趣的文章:- Python實現敏感詞過濾的4種方法
- python用類實現文章敏感詞的過濾方法示例
- 淺談Python 敏感詞過濾的實現
- 利用Python正則表達式過濾敏感詞的方法
- Python 實現王者榮耀中的敏感詞過濾示例
- python 實現敏感詞過濾的方法
- Python 敏感詞過濾的實現示例