一:需求
基于网站中用户进行输入的地方恶意使用敏感词等,在用户输入之后进行敏感词屏蔽,相比于网络上的大多数算法,DFA算法属于效率比较高的一种,以下是具体实现。
二:实现
(1):目录结构
[root@rainsty DirtyWordOfFilter]# ll
total 20
-rw-r--r-- 1 root root 1398 Apr 20 21:39 api.py
-rw-r--r-- 1 root root 45 Apr 20 21:39 __init__.py
drwxr-xr-x 2 root root 4096 Apr 22 22:47 __pycache__
drwxr-xr-x 2 root root 4096 Apr 20 21:39 static
-rw-r--r-- 1 root root 220 Apr 20 21:39 __version__.py
[root@rainsty DirtyWordOfFilter]#
(2):词库
将需要过滤的词,做成json文件,利用python的dict数据结构,实现快速查询。
实例如下:WordLibrary.json
{
"一":{
"夜":{
"情":{
"\u0000":0
},
"欢":{
"\u0000":0
}
},
"本":{
"道":{
"\u0000":0
}
}
}
}
(3):API代码
----api.py
import os
import json
HERE = os.path.realpath(__file__).strip()[:-6]
class DFAFilter(object):
def __init__(self):
self.keyword_chains = {}
with open(os.path.join(HERE, 'static', 'WordLibrary.json'), 'r', encoding='utf-8') as f:
self.keyword_chains = json.loads(f.read())
self.delimit = '\x00'
def filter(self, message, word_re="*"):
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]:
if step_ins == 1:
level = level[char]
else:
ret.append(word_re * step_ins)
start += step_ins - 1
break
else:
ret.append(word_re * step_ins)
start += step_ins - 1
break
else:
ret.append(message[start])
break
else:
ret.append(message[start])
start += 1
return ''.join(ret)
三:源码地址分享
源码地址:Github:[https://github.com/Rainstyed/rainsty/tree/master/Algorithm/DirtyWordOfFilter]