今天又干到凌晨四点,把最后一批爬下来的数据洗完了。客户要的是成都所有写字楼里的公司名录,带联系方式那种。爬虫抓回来的东西简直没法看,什么“成都市高新区天府三街XX大厦A座18楼1801室”,后面跟着一串可能是座机、可能是手机、还可能是传真号的数字,中间还夹着“电话:”、“Tel:”、“联系方式:”这些乱七八糟的前缀。正则?光靠正则根本搞不定,你得先判断这到底是个什么玩意儿。
我搞了个三层过滤框架。第一层用最粗暴的正则把疑似电话号码的字符串全捞出来,管它是7位、8位、11位还是带横杠的。第二层上逻辑判断,根据上下文关键词和字符串特征分类。比如,字符串前面三个字符是“028-”的,大概率是成都区号的座机,但还得看后面是7位还是8位,有些老号段是7位。手机号好办点,13/15/18开头,11位数字,但有些傻逼网站会把手机号中间用空格或者“-”隔开,你得先replace掉再判断。
最恶心的是第三层,人工规则库。这是我拿血泪换来的。比如,“86-28-xxxxxxx”这种,你得先把国际区号和国内区号剥掉。“转分机:1234”这种,得把分机号提取出来单独存一个字段。还有更绝的,地址里混着电话:“地址:天府五街XXX号(电话联系王经理)”,这种就得联动地址解析模块,先把括号里的内容切出来,再判断“王经理”是不是一个人名,如果是,这个电话就标记为“联系人电话”,置信度调低。光这个规则库我就维护了上百条,每接一个新行业的爬虫单子,就得往里加几条。
团队里新来的小孩问我,为啥不用现在那些NLP工具包试试自动识别?我让他试了。准确率?在理想的标准测试集上可能有个85%,一扔到我们这种脏乱差的实战数据里,立马掉到60%以下。识别出一个“028-1234567”,模型很自信地告诉你这是“日期”。因为训练语料里“028”作为区号出现的概率,可能远小于作为“2月28日”缩写的概率。AI现在就是个高级点的辅助,真到了要保证99%以上交付精度的商业场景,核心的、确定性的规则,还得靠人肉写的逻辑代码来扛。它帮你省掉的是“028-”这种明显规则的编写体力,但“到底是不是一个电话”这个判断权,你敢完全交给它?客户可是按条数付钱的,错一条扣一条的钱。
窗外天快亮了,樱花估计开了吧,朋友圈有人在发。但我没力气看了。团队这个月工资还没着落,下个季度的办公室租金账单就在邮箱里躺着。这些清洗框架再高效,也填不上管理上的坑。招的人要么写不出这种带业务逻辑的脏代码,要么写出来了但死活不愿意维护那个越变越厚的规则库,觉得“不优雅”、“没技术含量”。他们梦想着用最新的深度学习框架一举解决所有问题,但客户明天就要数据,模型还在那调参呢。优雅?能收到钱的代码才是最优雅的代码。
洗数据就像在垃圾场里淘金,大部分时间你都在和污泥打交道。AI像是一台高级的筛子,能帮你快速过滤掉明显的石块,但那些和金子长得一模一样的黄铜片,最终还得靠你戴着脏手套,用最笨的眼力和经验一片片挑出来。这活儿,一时半会儿还不会被替代。只是干这活儿的人,快被成本和交付压力替代了。














