4、数据采集与清洗:构建团伙关系网络

数据采集与清洗,说实话,是整个图谱工程的“脏活累活”。你后面模型再牛,算法再花哨,喂进去的数据要是垃圾,出来的一定也是垃圾。我这几年踩过的坑,十有八九都出在这个环节。

我个人习惯把这一步拆成两个动作:先把数据捞上来,再把脏东西洗掉。说白了,就是给团伙关系网络“备料”。

4.1 多源数据接入——你得知道去哪里捞

团伙识别,光靠一个系统通常不够。我做过一个项目,嫌疑人表面上用同一家物流公司的账号,但实际上资金流走的是第三方支付,通信数据又在另一个运营商的系统里。单看任何一个维度,他们就是普通用户。

所以数据采集的第一步:列清单。把可能隐含团伙关系的系统全部拉出来。

数据维度 常见来源 是否必采
资金流 银行流水、第三方支付、虚拟货币交易 强烈建议
通信流 通话记录、短信、即时通讯应用 强烈建议
地址流 物流寄递、外卖配送、地理位置打卡 建议
身份关联 注册信息、实名认证、设备指纹 必须

嗯,这里要注意:不是所有字段都要采。我见过团队把数据库里两百个字段全拉过来,最后真正有用的不到十个。费力不讨好。你想想看,真正影响团伙关系的,无非就是“谁和谁在什么时候、什么地方、做了什么”。

4.2 数据清洗三部曲

数据进到系统里,第一件事不是分析,是打扫。我称之为“三部曲”:

  1. 去重:同一笔交易在两个系统里各存一次,不洗掉,图谱里就会多一条假关系。
  2. 补全:关键字段不能空,比如身份证号、手机号、银行卡号。少了任何一个,实体对齐就断了。
  3. 过滤:那些明显没意义的噪音数据,比如“系统测试账号”、“已注销用户”,直接丢掉。

个人小技巧:我习惯在清洗阶段加一个“置信度”字段。比如地址信息,如果精确到门牌号,置信度打0.9;如果只到街道,打0.5。后面构图时,可以按置信度过滤,把低质量的边剪掉,图谱会干净很多。

4.3 实体对齐——把散落的人名串起来

这一步是数据清洗里最磨人的。同一个张三,在银行系统里叫“张三”,在快递系统里叫“张*三”,在聊天记录里叫“三哥”。你怎么办?

我的做法是:建一个统一身份ID。把强标识字段(身份证号、手机号、设备ID)作为主键,辅以规则做映射。举个例子:

def align_entity(name, phone, id_card):
    # 先以身份证为主匹配
    if id_card and len(id_card) == 18:
        return hash(id_card)
    # 次选手机号
    if phone and len(phone) == 11:
        return hash("phone_" + phone)
    # 最后靠姓名+辅助信息模糊匹配
    if name:
        return hash("name_" + name)
    return None

避坑指南:我曾经吃过一个亏——只靠姓名做对齐。结果有个犯罪团伙八个人共用同一对夫妻的名字注册账号……那之后我严格规定:强标识不够三个,决不对齐。宁漏勿错。

4.4 关系构建——从数据行变成边

数据清洗干净了,实体也归好了,接下来就要建关系。这一步其实就是把“二元组”提取出来:(实体A, 关系类型, 实体B, 时间, 权重)。

我整理了一个常用规则表:

数据特征 提取的关系 权重计算
同一IP登录两个账号 共用设备 登录频次
A向B转账超过3次 资金往来 转账金额总和
A和B共用收货地址 同址关系 使用次数
A在B注册后10分钟内注册 关联注册 时间差倒数

你看,这些规则都不复杂。但组合起来,就能织出一张密密麻麻的团伙关系网。我记得在某个反诈项目里,就是靠“共用设备”这条边,把一个原本孤立在资金流外的洗钱团伙给揪了出来。

4.5 清洗与构建的流程图

来,我画个图把整个流程串一下。从数据源到最终的团伙关系网络,中间每一步都少不了:

数据采集与清洗:从原始数据到关系网络 内部业务系统 第三方数据接口 爬虫/日志采集 离线文件导入 多源数据接入 数据清洗 去重 → 补全 → 过滤(剔除测试数据、空值、异常值) 实体对齐 身份证号 → 手机号 → 设备ID → 姓名模糊匹配 关系构建 提取二元组:(实体A, 关系类型, 实体B, 时间, 权重) 团伙关系网络(图谱) 采数阶段 清洗阶段 对齐阶段 构图阶段

这张图是我每次做项目前都会在白板上画的。流程不复杂,但每一步都有细节。比如说清洗阶段,我的原则是:宁可少,不可错。一条脏数据进到图谱里,可能衍生出十几条错误关系,后面排查起来成本极高。

一句话总结:数据采集与清洗,是在给团伙识别打地基。地基打得稳,后面怎么盖楼都不慌。我个人的经验是,这个阶段花掉整个项目 40% 的时间,一点都不亏。