+
100
-

回答

使用 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', '测试']

通过这种方式,你可以高效地检测和过滤敏感词。如果需要更复杂的匹配规则(如忽略大小写、模糊匹配等),可以进一步扩展代码。

网友回复

我知道答案,我要回答