You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于DFA的敏感词拦截:特定后缀豁免规则实现咨询

可行解决方案

方法一:扩展DFA的状态转移逻辑

把例外条件整合到DFA状态机里,让它不仅能识别敏感词,还能判断后续的豁免触发条件:

  • 当DFA匹配到“I love”的结束状态时,新增一个过渡状态,专门检查下一个输入的单词是否为“you”。
  • 如果后续输入是“you”,就从过渡状态跳转到初始状态,不触发拦截;如果不是(或没有更多输入),则触发拦截,把“I love”替换为“**”。
  • 这种方式把判断逻辑完全嵌入DFA,无需额外回溯,效率较高。

方法二:匹配后回溯校验

保留原有DFA的敏感词匹配逻辑,当检测到“I love”时,先暂停替换,向后校验后续内容:

  • 记录“I love”的结束位置,检查是否紧跟“ you”(注意空格,避免混淆)。
  • 如果后续是“ you”,就忽略这次匹配,继续处理文本;如果不是,就执行替换,将“I love”换成“**”。
  • 这种方式实现简单,不用修改DFA核心结构,适合快速调整规则,但要注意边界情况(比如敏感词在段落末尾时直接触发拦截)。

方法三:优先匹配豁免词+规则分层

把“I love you”设为最高优先级的豁免词,同时保留“I love”作为敏感词,调整匹配顺序:

  • 先用DFA匹配豁免词“I love you”,匹配到的部分标记为无需处理。
  • 再对剩余未标记文本运行敏感词DFA,匹配到“I love”时执行替换。
  • 这种方式依赖“长词优先匹配”策略,避免先匹配到“I love”误触发拦截,适合规则较多的场景。

示例伪代码(方法二)

def filter_text(text):
    # 假设已构建好匹配"I love"的DFA
    dfa = build_sensitive_dfa(["I love"])
    exempt_word = "you"
    result = []
    idx = 0
    text_len = len(text)
    
    while idx < text_len:
        # 获取敏感词匹配的结束索引
        match_end = dfa.find_match_end(text, idx)
        if match_end != -1:
            # 检查后续是否是" you"
            next_pos = match_end + 1
            if next_pos <= text_len - len(exempt_word) and text[next_pos:next_pos+len(exempt_word)] == exempt_word:
                # 豁免情况,保留原内容
                result.append(text[idx:next_pos+len(exempt_word)])
                idx = next_pos + len(exempt_word)
            else:
                # 替换敏感词,拼接后续内容
                result.append("**")
                result.append(text[match_end+1:])
                idx = text_len
        else:
            # 无匹配,添加当前字符
            result.append(text[idx])
            idx += 1
    return ''.join(result)

内容的提问来源于stack exchange,提问作者greenhand96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:24:54