用过 twitter 的 botometer 的同学都知道,botometer 可以通过检测 twitter 帐户的活动评价该账号属于垃圾内容制造者的可能性。

botometer 应该更倾向于社交机器人识别,而笔者在构建微博账号数据集的时候,更倾向于 spammer 识别,即虽然它是一个 bot 账号,但是内容和互动都正常,视为非 spammer 账号标记。

但是据笔者所知(可能笔者孤陋寡闻),weibo 并没有对应的产品或服务。于是我从 2022.12 开始着手训练微博 spammer 账号识别模型:检测微博账号是 spammer 的可能性,一共经历了三个阶段,前面两个阶段如下:

  1. 手动构建初始化数据集,只采用微博账号 profile 页面的粉丝数、关注数、微博数、认证类型、阳光信用等等特征,使用 DNN 神经网络,施以 PCA 降维和 L2 正则化,最终训练的准确率在 85% 左右。
  2. 继续扩充数据集,同时新增关系网络、微博文本采集并抽取相应特征,准确率来到 95%,但是多层关系网络的抓取等比较耗时,一个微博账号的特征信息采集抽取和识别耗时上百秒,无法做到实时识别;所以我舍弃了部分抓取耗时的字段,最终准确率固定在 90% 上下。

一般来说,提升一个模型的 ACC、ROC、F1,通常具有以下方法

  1. 扩充数据集。
  2. 降维。
  3. 正则化

正则化我在初代模型就已经用上了,最开始模型甚至不收敛,使用正则化收敛后的最终模型准确率在 85% 左右。

降维对这个 spammer 模型来说可能只是加快了训练过程,实测准确率并没有显著提升。

而扩充数据集是一直在做的工作,目前可能还需要一个量变等到质变的时刻。

对于一个模型能提升准确率的方法都做了,所有我只能换另外一个模型方法来做提升了。

最终选定 AdaBoost,他是三种集成学习 BaggingBoostingStacking 之一的 Boosting 方法下的一种名为 “Adaptive Boosting”方法(自适应增强)的缩写。

Boosting 的核心思想是 三个臭皮匠,赛过诸葛亮。一般来说,找到弱学习算法要相对容易一些,然后通过反复学习得到一系列弱分类器,组合这些弱分类器得到一个强分类器。

AdaBoost 算法的流程不算简单,感兴趣的可以搜索下。

最终我用 AdaBoost,在和上一篇推送一样,只抓取有限不耗时特征的前提下,准确率从 90% 左右直接稳定到了 95%+,识别一个给定 uid 的微博账号的 spammer 属性,耗时在 5s 以内。

最后把这个最新模型上线,视作 alpha 版本,上篇推送的模型为一般版本,长期测试 alpha 版本后,最后会覆盖一般版本。

模型网页测试地址为

https://weibo-crawl-visual.buyixiao.xyz/weibo-spammer-evaluator

其中第一个 tab 是一般版本,最后一个 tab 为 alpha 版本。

同时新增了 API 接口调用,接口地址是:

https://api.buyixiao.xyz/weibo/spammer-account-evaluate

使用 Python 调用该接口的 demo 代码如下:

1
2
3
4
5
6
7
8
9
10
11
test_token = "在此处填入你申请的 token"
def test_spammer_evaluate(user_id):
resp = requests.get(url=f'https://api.buyixiao.xyz/weibo/spammer-account-evaluate', params={
'user_id': user_id, # 必选参数,检测的微博账号 id
'token': test_token, # 必选参数,校验接口
'alpha': true # 可选参数,是否采用最新的 alpha 内测模型
})

print(resp.url)
print(resp.json())
test_spammer_evaluate(user_id="2557129567")

网页可以输入单个微博账号的 uid 免费测试,而 token 的申请是按量付费的。