敏感词替换(DFA算法),替换前后缀包含敏感词的单词,或者替换指定的单词

DFA

DFA即Deterministic Finite Automaton,也就是确定有穷自动机。在实现文字过滤的算法中,DFA是比较好的实现算法。

具体是什么原理呢?

存在如下几个敏感词:日本人、日本鬼子、*.*.*。

首先:query 日 ---> {本}、query 本 --->{人、鬼子}、query 人 --->{null}、query 鬼 ---> {子}。形如下结构:

 

         下面我们在对这图进行扩展:

 

这样我们就将我们的敏感词库构建成了一颗树,这样我们判断一个词是否为敏感词时就大大减少了检索的匹配范围。比如我们要判断日本人,根据第一个字我们就可以确认需要检索的是那棵树,然后再在这棵树中进行检索。

具体实现

将敏感词放入HashSet中,构建一个DFA算法模型,例如:

  中 = { 
isEnd = 0
国 = {<br>
isEnd = 1
人 = {isEnd = 0
民 = {isEnd = 1}
}
男 = {
isEnd = 0
人 = {
isEnd = 1
}
}
}
}
五 = {
isEnd = 0
星 = {
isEnd = 0
红 = {
isEnd = 0
旗 = {
isEnd = 1
}
}
}
}

isEnd,判断该字是否为该词中的最后一个字。若是表示敏感词结束,设置标志位isEnd = 1,否则设置标志位isEnd = 0。

我们接下来实现一个例子,要求:

  • 能够屏蔽单个单词。例如,敏感词“nice”,原文“U are a nice guy”,输出“U are a XXXX guy” ;
  • 能够屏蔽多个单词。例如,敏感词“nice”,“sun”,原文“Such a nice day  with a bright sun”,输出“Such a XXXX day  with a bright XXX”
  • 能够替换包含敏感字作为前缀的单词,例如,原文“U are so friendly”,输出“U are so XXXXXXXX”
  • 能够替换包含敏感字作为后缀的单词。如上。
  • 能够指定将敏感词替换为指定单词。例如,原文“Objection is bad,a better thing to do”,输出“Objection is ungood,a gooder thing to do”

源码在https://github.com/Ivyvivid/algorithm

这里只是简单的实现,性能上可以再优化。里面有一个没想到解决方法,按符号标点split,组装回string时,标点符号消失。希望有人可以解决。

相关推荐:

如何在Python中通过计算欧氏距离实现基础的最近邻分类算法?

欧氏距离计算函数怎么写才不出错? 直接用math.sqrt和sum手动算平方和开方最稳妥,避免依赖未安装的库。常见错误是传入维度不一致的向量,比如训练样本是4维,测试样本只给了3个值——运行时会报IndexError或得到错误结果。 实操建议: 在计算前用len(vec1)==len(vec2)做校...

如何使用Python中的Isolation Forest算法实现生产环境的异常检测?

IsolationForest在生产环境不适合直接用于高吞吐、低延迟的实时流式场景,因其为无监督批处理算法,需完整训练集且无法在线更新模型,实际应采用周期性离线打分或结合轻量代理模型实现近实时响应。 IsolationForest在生产环境是否适合实时异常检测? 不适合直接用于高吞吐、低延迟的实时流...

如何在Python Flask中实现敏感词过滤_构建自定义中间件

Flask中不能直接在路由里做敏感词过滤,因重复代码多、易漏检、难统一响应格式,且无法覆盖所有入口;应使用WSGI中间件或before_request钩子在请求进入视图前拦截,中间件更底层可靠,职责仅为阻断而非清洗。 Flask中为什么不能直接在路由里做敏感词过滤 因为重复代码多、易漏检、难统一响应...

LightGBM在Python下为什么比XGBoost快_基于直方图算法与单边梯度采样

LightGBM比XGBoost快的核心原因是直方图特征离散化和GOSS采样:前者将连续特征映射为整数桶,降低排序与增益计算复杂度;后者保留高梯度样本并加权采样低梯度样本,减少数据遍历量。 LightGBM在Python下比XGBoost快,核心原因不是“代码写得更精简”,而是算法层面的两个关键设计...

高效实现滚动窗口最小二乘贝塔系数的在线更新算法

本文介绍如何通过数学推导与增量计算,将滚动窗口ols贝塔系数的实时更新从o(n)矩阵运算优化至o(1)时间复杂度,显著提升金融时序信号生成性能。 本文介绍如何通过数学推导与增量计算,将滚动窗口ols贝塔系数的实时更新从o(n)矩阵运算优化至o(1)时间复杂度,显著提升金融时序信号生成性能。 在量化投...