我最近受到启发,想用 JavaScript,以 Greasemonkey 风格,为一些我常用的、容易出现垃圾信息的网站(尤其是在评论中)编写垃圾信息过滤器。在考虑如何实现时,我意识到有几种选择,每种选择都有优点和缺点。我提出这个问题的主要目的是扩展我创建的这个列表,并希望能确定用 JavaScript 进行客户端垃圾信息过滤的最佳方法。
至于什么使得一个垃圾信息过滤器成为“最佳”,我认为应该符合以下标准:
- 最准确
- 最不容易受到攻击
- 最快
- 最透明
另外,请注意,我正在尝试过滤已经存在于非我所有的网站上的内容,使用 Greasemonkey Userscripts。换句话说,我无法阻止垃圾信息;我只能过滤它。
这是我目前尝试编译的各种方法列表,以及它们的缺点和优点:
基于规则的过滤器:
工作原理: 通过为不同的标准(例如,全部大写、全部非字母数字等)分配一个点值来“评分”消息。根据分数,消息被丢弃或保留。
优点:
- 易于实现
- 大部分是透明的
缺点:
- 透明 – 通常很容易对代码进行逆向工程,以发现规则,从而制作出不会被识别的消息
- 难以平衡点值(误报)
- 可能很慢;必须对每条消息执行多个规则,很多时候使用正则表达式
- 在客户端环境中,需要服务器交互或用户交互来更新规则
贝叶斯过滤:
工作原理: 分析词频(或三字母组频率),并将其与已训练的数据进行比较。
优点:
- 无需制定规则
- 快速(相对而言)
- 更难进行逆向工程
缺点:
- 需要训练才能有效
- 训练后的数据仍然必须可以被 JavaScript 访问;通常以人类可读的 JSON、XML 或平面文件的形式存在
- 数据集可能变得非常大
- 设计不佳的过滤器很容易被大量常用词混淆,从而降低 垃圾度 评级
- 以前从未见过的词无法被准确分类;有时会导致整个消息的错误分类
- 在客户端环境中,需要服务器交互或用户交互来更新规则
贝叶斯过滤 – 服务器端:
工作原理: 通过将每条消息提交到远程服务器进行分析,在服务器端应用贝叶斯过滤。
优点:
- 普通贝叶斯过滤的所有优点
- 训练数据不会透露给用户/逆向工程师
缺点:
- 流量大
- 仍然容易受到不常见词的影响
- 仍然容易受到添加常用词以降低垃圾度影响
- 该服务本身可能会被滥用
- 为了训练分类器,可能需要允许用户提交垃圾信息样本进行训练。攻击者可能会滥用此服务
黑名单:
工作原理: 将一组标准应用于消息或其某些属性。如果一个或多个(或特定数量的)标准匹配,则消息被拒绝。很像基于规则的过滤,因此请参阅其描述以了解详细信息。
验证码等:
对于这种类型的应用程序来说不可行。我正在尝试将这些方法应用于已经存在的站点。Greasemonkey 将用于执行此操作;我不能在某人安装我的脚本之前,开始在以前没有验证码的地方要求验证码。
有人能帮我填写空白吗?谢谢,
回答:
没有“最佳”方法,特别是对于所有用户或所有情况。
保持简单:
- 让 GM 脚本最初隐藏所有包含链接的评论,也许还有通用的不良词语(F*ck,长老会等)。 😉
- 然后脚本联系你的服务器,让服务器通过 X 个标准来判断每条评论(更多信息如下)。
- 根据服务器响应显示或隐藏评论。 如果超时,则根据用户首选项设置显示或隐藏(“当过滤服务器关闭时该怎么做? (显示/隐藏带链接的评论))。
- GM 脚本就是这样;其余的由服务器处理。
至于实际的服务器/过滤标准…
最重要的是不要妄想你能猜到用户想要过滤什么! 这会因人而异,甚至因心情而异。
设置服务器以使用不良词语、不良链接目的地(例如 .ru 和 .cn 域名)和公共垃圾信息过滤服务的组合。
最重要的是为用户提供一些选择和理想情况下调整应用于他们的内容的方法。