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

news/2024/7/10 19:17:07 标签: Node.js, JavaScript, 开源

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

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

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

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

安装方法

# 安装到当前项目
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 words385ms
40000 words654ms
60000 words1108ms
80000 words1273ms
100000 words1659ms

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

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

20000 words12ms
40000 words28ms
60000 words35ms
80000 words49ms
100000 words51ms

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

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

0 words14M
20000 words81M
40000 words135M
60000 words184M
80000 words234M
100000 words277M

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

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

图片

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


http://www.niftyadmin.cn/n/1732311.html

相关文章

Egret白鹭H5开发-围住神经猫

前言 今年9月份跳槽从Android转向前端H5网页和H5小游戏开发,一开始自己学习用Canvas做了拼图、贪吃蛇大作战等小游戏,在公司边学习边用phaser写了个手势识别的小游戏,现在公司想尝试转型Egret白鹭引擎来开发H5,碰巧最近有个类似围…

jQuery 遮罩层效果

最精简&#xff0c;最强大的 jQuery 遮罩层效果。1. 当浏览器改变大小时&#xff0c;遮罩层的大小会相应地改变。2. 遮罩层上方的对话框可随 scroll 的改变而改变&#xff0c;即对话框居中显示。 HTML Code&#xff1a; <div id"main"> <a href"#&qu…

数据可视化:浅谈热力图如何在前端实现

作者 个推开发工程师甄鑫当我们需要用更直观有效的形式来展现各类大数据信息时&#xff0c;热力图无疑是一种很好的方式。作为一种密度图&#xff0c;热力图一般使用具备显著颜色差异的方式来呈现数据效果&#xff0c;热力图中亮色一般代表事件发生频率较高或事物分布密度较大&…

前端文件下载通识篇

前言 前端如何实现下载文件呢?随着前端技术的发展&#xff0c;越来越多的前端需求中会出现下载文件这样的需求。 看着掘金很多人在近期不断的分享有关的文章&#xff0c;我总结了下自己的经验&#xff0c;根据不同情况&#xff0c;总结了一篇算是前端文件下载的通识篇&#…

实现前端弹簧动效

弹簧动效是IOS系统原生自带的一个效果&#xff0c;如在iPhone上面的照片点开大图的展示效果就是一个弹簧动画&#xff0c;如下图所示&#xff1a;它有一个弹闪的过程&#xff0c;一大一小交替缩放就像一个弹簧在弹动一样&#xff0c;而不是以往那种简单的线性变大。 如果使用CS…

屏蔽IE的快捷键

<script> function KeyDown(){ //屏蔽鼠标右键、Ctrln、shiftF10、F5刷新、退格键 //alert("ASCII代码是&#xff1a;"event.keyCode); if ( (window.event.altKey)&& ( (window.event.keyCode37)|| //屏蔽 Alt 方向键 ← (window.event.keyCode39) )…

停留在网页顶部随着滚动条移动而不动JQUERY代码

要讲解里面的原因&#xff0c;请留言。<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> …

cocos creator 视频交互游戏

前段时间刚参加完cocos开发者沙龙-杭州站&#xff0c;听完cocos技术总监panda对creator 2.0框架升级性能优化2.1版本3d渲染的介绍后&#xff0c;感觉creator的未来还是非常不错的。今天就给大家分享下最近做的一个视频与游戏相结合的教育类游戏。 如果对cocos creator不是很了解…