sensitive-words

Introduction: Java 快速中文敏感词过滤,在 15k 敏感词库上的过滤速度超过 50M 字符每秒。
More: Author   ReportBugs   
Tags:

本项目不再维护

详见 issues,存在一些问题,暂时没有精力修复,不推荐使用。感谢理解 即将停止和移除(本项目计划于 1 月 31 日停止和移除)

性能概述

使用 60MB 大小的小说测试,单核性能超过 50M 字符每秒(i7 2.3GHz)。

敏感词 14553 条
待过滤文本共 599254 行,30613005 字符。
过滤耗时 0.535 秒, 速度为 57220.6 字符/毫秒
其中 39691 行有替换

优化方式

主要的优化目标是速度,从以下方面优化:

  1. 敏感词都是 2 个字以上的,
  2. 对于句子中的一个位置,用 2 个字符的 hash 在稀疏的 hash 桶中查找,如果查不到说明一定不是敏感词,则继续下一个位置。
  3. 2 个字符(2x16 位),可以预先组合为 1 个 int(32 位)的 mix,即使 hash 命中,如果 mix 不同则跳过。
  4. StringPointer,在不生成新实例的情况下计算任意位置 2 个字符的 hash 和 mix
  5. StringPointer,尽量减少实例生成和 char 数组的拷贝。

敏感词库

默认敏感词库拷贝自 https://github.com/observerss/textfilter ,并删除如女人然后这样的几个常用词。 使用默认敏感词库的示例如下

// 使用默认单例(加载默认敏感词库)
SensitiveFilter filter = SensitiveFilter.DEFAULT;
// 向过滤器增加一个词
filter.put("婚礼上唱春天在哪里");

// 待过滤的句子
String sentence = "然后,市长在婚礼上唱春天在哪里。";
// 进行过滤
String filted = filter.filter(sentence, '*');

// 如果未过滤,则返回输入的 String 引用
if(sentence != filted){
    // 句子中有敏感词
    System.out.println(filted);
}

打印结果

然后,**在*********。

依赖

JDK 1.7 版本及以上

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools