4、数据采集与清洗:构建团伙关系网络
数据采集与清洗,说实话,是整个图谱工程的“脏活累活”。你后面模型再牛,算法再花哨,喂进去的数据要是垃圾,出来的一定也是垃圾。我这几年踩过的坑,十有八九都出在这个环节。
我个人习惯把这一步拆成两个动作:先把数据捞上来,再把脏东西洗掉。说白了,就是给团伙关系网络“备料”。
4.1 多源数据接入——你得知道去哪里捞
团伙识别,光靠一个系统通常不够。我做过一个项目,嫌疑人表面上用同一家物流公司的账号,但实际上资金流走的是第三方支付,通信数据又在另一个运营商的系统里。单看任何一个维度,他们就是普通用户。
所以数据采集的第一步:列清单。把可能隐含团伙关系的系统全部拉出来。
| 数据维度 | 常见来源 | 是否必采 |
|---|---|---|
| 资金流 | 银行流水、第三方支付、虚拟货币交易 | 强烈建议 |
| 通信流 | 通话记录、短信、即时通讯应用 | 强烈建议 |
| 地址流 | 物流寄递、外卖配送、地理位置打卡 | 建议 |
| 身份关联 | 注册信息、实名认证、设备指纹 | 必须 |
嗯,这里要注意:不是所有字段都要采。我见过团队把数据库里两百个字段全拉过来,最后真正有用的不到十个。费力不讨好。你想想看,真正影响团伙关系的,无非就是“谁和谁在什么时候、什么地方、做了什么”。
4.2 数据清洗三部曲
数据进到系统里,第一件事不是分析,是打扫。我称之为“三部曲”:
- 去重:同一笔交易在两个系统里各存一次,不洗掉,图谱里就会多一条假关系。
- 补全:关键字段不能空,比如身份证号、手机号、银行卡号。少了任何一个,实体对齐就断了。
- 过滤:那些明显没意义的噪音数据,比如“系统测试账号”、“已注销用户”,直接丢掉。
个人小技巧:我习惯在清洗阶段加一个“置信度”字段。比如地址信息,如果精确到门牌号,置信度打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 清洗与构建的流程图
来,我画个图把整个流程串一下。从数据源到最终的团伙关系网络,中间每一步都少不了:
这张图是我每次做项目前都会在白板上画的。流程不复杂,但每一步都有细节。比如说清洗阶段,我的原则是:宁可少,不可错。一条脏数据进到图谱里,可能衍生出十几条错误关系,后面排查起来成本极高。
一句话总结:数据采集与清洗,是在给团伙识别打地基。地基打得稳,后面怎么盖楼都不慌。我个人的经验是,这个阶段花掉整个项目 40% 的时间,一点都不亏。