最近在做一个项目,寻遍了 Node 开源社区居然没有发现一个好用的敏感词过滤库,有那么几个库外观上看起来似乎还不错,用起来却一塌糊涂,震惊有余,失望至极。于是花了一天时间自己撸了一个库,库名叫 fastscan,这是我的第一个 Node 开源项目,它也可以用于浏览器环境。fastscan 基于广为人知的 ahocorasick 高性能字符串匹配算法。

项目地址:https://github.com/pyloque/fastscan

演示地址:https://pyloque.github.com/fastscan


考虑到太多的违禁词汇,所以缩小化显示,缩小到让你看不清楚。如果想看清楚一点,还是去演示地址里面看吧。消灭敏感词是每个公民义不容辞的责任!你不站岗我不站岗,谁保卫咱祖国谁来保卫家!读者们你们要是敢举报,看我不砍死你!

安装方法

# 安装到当前项目
npm install --save fastscan
# 写了不少单元测试,感兴趣运行一下
npm test

使用方法

import FastScanner from fastscanvar words = ["今日头条","微信", "支付宝"]
var scanner = new FastScanner(words)
var content = "今日头条小程序终于来了,这是继微信、支付宝、百度后,第四个推出小程序功能的App。猫眼电影率先试水,出现在今日头条。"
var offWords = scanner.search(content)
console.log(offWords)
var hits = scanner.hits(content)
console.log(hits)-------------
[ [ 0, '今日头条' ], [ 15, '微信' ], [ 18, '支付宝' ], [ 53, '今日头条' ] ]
{ '今日头条': 2, '微信': 1, '支付宝': 1 }

API

  1. 查询匹配的词汇以及所在字符串的位置 search(content, option={})
  2. 查询匹配词汇的命中数量 hits(content, options={})
  3. 临时动态增加词汇,不修正其它词汇的回溯指针 add(word)
options = {quick: false, longest: false}
  1. quick 选项表示快速模式,匹配到一个就立即返回
  2. longest 表示最长模式,同一个位置出现多个词汇(中国、中国人),选择最长的一个(中国人)
  3. 默认匹配出所有的词汇,同一个位置可能会出现多个词汇

性能

项目代码使用原生的 js 实现,我开始非常担心词汇树的构建速度会不会太慢。经测试后发现虽然性能不算太快,不过也不是太差,对于绝大多数项目来说已经绰绰有余了。我分别测试了构造 20000~100000 个词汇的树结构,每个词汇随机在 10~20之间,耗时情况如下

20000 words 385ms
40000 words 654ms
60000 words 1108ms
80000 words 1273ms
100000 words 1659ms

如果你的词汇比较短小,构建树的速度还会更快。

查询性能我并不担心,因为 ahocorasick 算法在词汇长度较短的情况下复杂度是 O(n),性能和被过滤内容的长度乘线性变化。下面我使用 100000 词汇量构建的树分别对 20000 ~ 100000字的内容进行了过滤,耗时情况如下

20000 words 12ms
40000 words 28ms
60000 words 35ms
80000 words 49ms
100000 words 51ms

fastscan 可以做到以迅雷不及掩耳的速度扫遍一幅 10w 字的长文,10w 大概就是一部中篇小说的长度了。如果你要扫百万字的长篇小说,那还是建议你分章分节来扫吧。

内存占用也是需要考虑的点,内存对于 Node 程序来说本来就非常有限,如果因为敏感词树占据了太大的内存那是非常要不得的大问题。所以我也对内存占用进行了测试,下面是测试的结果

0 words 14M
20000 words 81M
40000 words 135M
60000 words 184M
80000 words 234M
100000 words 277M

词汇量不是太大的话,这样的内存占用还是可以接受的。如果你对内存占用不满意,那就只能使用 Node 的 C 语言扩展来打造更高性能的库了,考虑到成本问题,恕我目前无能为力。

注:不得不说,node 社区发布开源类库太方便了,npm login && npm publish 轻松搞定。个人觉得这大概就是 node 轮子多的罪魁祸首。对比之前发布 java 社区开源项目,感觉自己头发都快掉光了,造轮子比发布轮子还要轻松。


如果读者比较关心算法的原理和细节,请关注我的公众号「码洞」,后续我会编写相关文章来仔细讲解算法的原理,以及对 fastscan 项目代码的剖析。

开源了一个 JavaScript 版敏感词过滤库相关推荐

  1. 一个高效的敏感词过滤方法(PHP)

    效率对比(12688个字符,替换1次): str_replace: 0.109937906265秒 strtr: 0.0306839942932秒 替换结果对比 比如:「张三」.「张三丰」.「张三丰田 ...

  2. 5分钟Serverless实践 | 构建无服务器的敏感词过滤后端系统

    前言 在上一篇"5分钟Serverless实践"系列文章中,我们介绍了什么是Serverless,以及如何构建一个无服务器的图片鉴黄Web应用,本文将延续这个话题,以敏感词过滤为例 ...

  3. 5分钟搞定敏感词过滤!

    函数工作流(FunctionGraph,FGS)是一项基于事件驱动的函数托管计算服务,托管函数具备以毫秒级弹性伸缩.免运维.高可靠的方式运行.通过函数工作流,开发者无需配置和管理服务器,只需关注业务逻 ...

  4. 【C++】实现敏感词过滤算法(含源码)

    敏感词过滤算法(聚合词树查询法) 1.构建词树 2.敏感词判断 3.遍历文本 关于敏感词过滤算法,数不胜数,在参考众多算法后,选取了比较实用的算法,进行总结与改进.大家可以参考一下链接: 敏感词过滤算 ...

  5. PHP敏感词过滤【整理实践版】

    2019独角兽企业重金招聘Python工程师标准>>> 由于国内互联网管制政策,强大的敏感词过滤系统成为了每一个网站必须具备的基本功能,尤其是那些涉及UGC内容的站点. 对敏感词过滤 ...

  6. 1.设计一个敏感词过滤程序

    1.设计一个敏感词过滤程序 WordFilter类 属性:数组类型[]存放敏感词 设计一个方法,调用这个方法(传参,可能会包含敏感词的字符串),返回过滤后的新的字符串public static Str ...

  7. .设计一个敏感词过滤程序

    1.设计一个敏感词过滤程序     WordFilter类         属性:数组类型[]存放敏感词 设计一个方法,调用这个方法(传参,可能会包含敏感词的字符串),返回过滤后的新的字符串      ...

  8. php敏感词过滤的一个方法

    对敏感词进行过滤, fiter类 class Fiter {private $dict;private $dictPath;public function __construct($dictPath) ...

  9. Javascript 05:敏感词过滤

    replace() 替换 <!DOCTYPE html> <html><head><meta charset="utf-8">< ...

最新文章

  1. xcode 的一些问题
  2. springmvc整合mybatis框架源码 bootstrap html5 mysql oracle maven SSM
  3. 什么是php商城系统?
  4. GVRP和VTP比较
  5. 如何判断两个平面相交_初一数学下册预习第五章 相交线与平行线上
  6. 你胆敢在case后面不加break试试?
  7. 网络操作系统第242页作业
  8. Flask爱家租房--城区信息
  9. 初窥Javascript单元测试,附带掌握一门新技能的学习方式。
  10. BiLSTM-CRF模型中的CRF层讲解
  11. vue引入阿里矢量图标库
  12. android onenote字体,【完美解决】OneNote中英文字体不统一,微软10多年未解决的Bug!...
  13. 锐道发布Dorado Dorado7标准件 -1.0.24 beta版
  14. css层叠排版,请收下这72个炫酷的CSS技巧
  15. 【洛谷】洛谷深基学习记录 第二章 顺序结构程序设计
  16. 码云上面优秀的java项目_秒建一个后台管理系统?用这5个开源免费的Java项目就够了...
  17. js base64和图片 相互转换
  18. SUST暑期集训题解(可持久化数据结构)
  19. 金山软件刘鑫:有限使用UML
  20. 360n4手机可以装linux,360手机N4 root教程_360手机N4获取root权限的方法

热门文章

  1. Winform如何设置Mdi窗体
  2. 带符号二进制数的表示方法与常用编码
  3. ag-grid表格基本使用方法-React版本
  4. mysql更新语句sql,瞬间高大上了!
  5. css display table 自适应高度、宽度问题
  6. 自动展示目录下的图片html,Html读取本地文件夹下图片并显示
  7. 【游戏交互设计】引导的设计理论——推销学原理AIDA模式
  8. mode是什么意思 sniff_MODE是什么意思?怎么用?
  9. Windows-bat或exe文件设置为开机自动启动项或服务项
  10. keep 虚拟路线修改器_Keep 动感单车体验:每天在家就能消耗 250 千卡,你离瘦不远了...