开源了一个 JavaScript 版敏感词过滤库

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

项目地址:github.com/pyloque/fas…node

演示地址:pyloque.github.com/fastscangit

考虑到太多的违禁词汇,因此缩小化显示,缩小到让你看不清楚。若是想看清楚一点,仍是去演示地址里面看吧。消灭敏感词是每一个公民责无旁贷的责任!你不站岗我不站岗,谁保卫咱祖国谁来保卫家!读者们大家要是敢举报,看我不砍死你!github

安装方法

# 安装到当前项目
npm install --save fastscan
# 写了很多单元测试,感兴趣运行一下
npm test
复制代码

使用方法

import FastScanner from fastscan

var 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

若是你的词汇比较短小,构建树的速度还会更快。npm

查询性能我并不担忧,由于 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 程序来讲原本就很是有限,若是由于敏感词树占据了太大的内存那是很是要不得的大问题。因此我也对内存占用进行了测试,下面是测试的结果bash

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 项目代码的剖析。

相关文章
相关标签/搜索