使用 DFA(Deterministic Finite Automaton,确定有限状态自动机)算法进行敏感词检测是一种高效的方式。以下是 Python 实现 DFA 算法的步骤和代码示例:
步骤构建敏感词库:
将敏感词列表转换为 DFA 的状态转移表。使用字典嵌套结构表示状态转移。初始化 DFA:
创建一个初始状态(通常是空字典)。添加敏感词:
遍历每个敏感词,逐个字符构建状态转移。检测文本:
遍历待检测文本,根据 DFA 状态转移表匹配敏感词。代码实现class DFASensitiveWordFilter:
def __init__(self):
# 初始化 DFA 的根节点
self.root = {}
self.end_symbol = "__end__" # 敏感词结束标志
def add_word(self, word):
"""添加敏感词到 DFA"""
node = self.root
for char in word:
if char not in node:
node[char] = {} # 创建新的状态节点
node = node[char] # 移动到下一个状态
node[self.end_symbol] = True # 标记敏感词结束
def build(self, words):
"""构建 DFA 状态转移表"""
for word in words:
self.add_word(word)
def contains_sensitive_word(self, text):
"""检查文本是否包含敏感词"""
node = self.root
for char in text:
if char in node:
node = node[char] # 移动到下一个状态
if self.end_symbol in node: # 如果到达敏感词结尾
return True
else:
node = self.root # 重置到初始状态
return False
def find_all_sensitive_words(self, text):
"""查找文本中的所有敏感词"""
sensitive_words = set()
length = len(text)
for i in range(length):
node = self.root
for j in range(i, length):
char = text[j]
if char in node:
node = node[char]
if self.end_symbol in node: # 找到敏感词
sensitive_words.add(text[i:j + 1])
else:
break
return list(sensitive_words)
# 示例用法
if __name__ == "__main__":
# 敏感词库
sensitive_words = ["敏感词1", "敏感词2", "测试"]
# 初始化 DFA 过滤器
dfa_filter = DFASensitiveWordFilter()
dfa_filter.build(sensitive_words)
# 待检测文本
text = "这是一段包含敏感词1和测试的文本。"
# 检测是否包含敏感词
if dfa_filter.contains_sensitive_word(text):
print("文本包含敏感词!")
else:
print("文本安全。")
# 查找所有敏感词
found_words = dfa_filter.find_all_sensitive_words(text)
print("发现的敏感词:", found_words) 代码说明DFA 结构:
使用嵌套字典表示状态转移,例如 {"敏": {"感": {"词": {"__end__": True}}}}。__end__ 是敏感词结束的标志。添加敏感词:
通过 add_word 方法将敏感词逐个字符添加到 DFA 中。检测敏感词:
contains_sensitive_word 方法用于快速检测文本是否包含敏感词。find_all_sensitive_words 方法用于查找文本中所有敏感词。性能优化:
DFA 算法的时间复杂度为 O(n),其中 n 是文本长度,适合高效检测。输出示例文本包含敏感词! 发现的敏感词: ['敏感词1', '测试']
通过这种方式,你可以高效地检测和过滤敏感词。如果需要更复杂的匹配规则(如忽略大小写、模糊匹配等),可以进一步扩展代码。
网友回复


