使用 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', '测试']
通过这种方式,你可以高效地检测和过滤敏感词。如果需要更复杂的匹配规则(如忽略大小写、模糊匹配等),可以进一步扩展代码。
网友回复