同一张收据,字符略有不同,系统就当成另一笔理赔
一句话总结
查找重复索赔,不是查找相同的字符串,而是查找规范化之后变得相同的记录,并只保留其中真正重复的。困难而昂贵的不是找出来,而是减少误报。
为什么需要它
保险理赔的受理渠道有很多个。可以在 App 上传照片,也可以在网页上再提交一次,可以在柜台递交纸质材料,还有传真。通信中断时,App 还会重新发送同一个请求。所以同一次就诊在受理系统里留下多行记录,不是例外,而是常态。
这里混杂着两种不同的情况。一种是完全重复。连索赔编号都相同的记录进来了两行。这是重传,按索赔编号合并就解决了。另一种是实质重复。索赔编号不同,但是同一张收据。通过 App 提交后,觉得处理得慢,又到柜台提交了一次。这一类的字符并不完全相同。App 收到的姓名是“Kim Seojun”,而柜台工作人员写成“Kim Seo jun”。收据编号在 App 中连连字符一起原样转录,而柜台系统则以全角字符存储。
漏掉第二种,同一笔钱就会被赔付两次。但反方向的事故更不容易被察觉。如果把同一天在同一家医院真的看了两次病的人的索赔当作重复拦下,客户就会在不知道原因的情况下领不到赔付,并打电话给客服中心。构建检测器的工作有一半就是减少这种误报。
工作原理
顺序始终一样。规范化 → 分块 → 相似度 → 阈值 → 容差 → 误报规则。
规范化。先把写法上的差异消除。在 Unicode 规范化形式中,NFKC 是先做兼容分解、再做规范组合的形式(UAX #15),它会把全角字母数字这类只是外形不同的兼容字符,还原为普通形式。在实验镜像中实际测量,unicodedata.normalize("NFKC", "RC-2026") 会返回 "RC-2026"。再加上去除空格和去除连字符,各个柜台不同的写法就会汇集为同一个值。unicodedata 模块和 Unicode 使用指南对这些形式有说明。
分块。25 万笔记录两两比较,会产生 300 亿个配对。所以只把共享相同值的记录分到一组,仅在组内比较。本实验把规范化后的医院名称和就诊日期用作块键。分块不是免费的。块键错了,这个配对一开始就进不了候选。医院名称写法不一致而导致块被拆开的情况很常见,所以块键也要使用规范化后的值。
相似度。使用 difflib 的 SequenceMatcher。设两个序列的元素总数为 T、匹配元素数为 M,则 ratio() 就是 2.0*M / T。完全相同为 1.0,没有任何重叠为 0.0。有一个陷阱:第二个序列有 200 个以上元素时,会启动自动 junk 启发式,把占比超过 1% 的元素视为 junk。姓名和收据编号很短,所以没有影响,但比较长文本时,应当考虑使用 autojunk=False。而且这个启发式是不对称的,交换 A 和 B,结果可能不同。
阈值与容差。对各项的相似度加权求和得出分数,并用两道门槛切分。高门槛以上为重复,中间为需要人工查看的区间,低门槛以下为不相关。在此基础上再叠加金额和日期的容差。即使分数是 1.0,只要金额相差 4 千韩元,那也可能不是同一张收据。不要自动拦截,而是交给人工处理。
误报规则。同一天在同一家医院连续取得的收据,编号是连号。按字符串相似度来看,十二位中只有一个字符不同,得到 0.93,而姓名和医院也相同,所以合计分数会超过门槛。这不是重复,而是相邻的单据。如果编号的最后一段数字只相差 1 到 5,就把它从重复候选中剔除。
청구 25만 ──▶ 정규화 ──▶ 블록 ──▶ 블록 안의 쌍 ──▶ 점수 ──▶ 허용 오차 ──▶ 오탐 규칙
│ │ │
duplicate review distinct
在现场相遇的样子
最常见的错误是只按索赔编号合并。这样重传能被发现,而实质重复一个也发现不了。而且这一事实在界面上并不会暴露出来。每天都会生成“重复 0 笔”的报告,直到赔付之后在审计中才被发现。
第二种是只给出分数,不留下依据。审核人员即使拿到“0.94”,也不知道该确认什么。如果把哪些项目相同使分数升高以列表形式留下,经办人只需要用眼睛看这几项,5 秒就能完成。判定结果不是自动化的输出,而是人的输入。
第三种是在没有数据的情况下确定阈值。仅仅因为 0.9 看起来不错就这么定了,那么上线时并不知道每天会有多少笔转交给人工。调查人手一天只能处理 30 笔,却来了 200 多笔,这份清单几天就会被无视。阈值不是规则,而是与人力之间的契约。
实际工作中真正重要的事
- 规范化规则要写进文档,并且双方使用同一份代码。检测器和审核界面如果使用不同的规则,在经办人看来就是系统出错了。
- 重传只做合并,不计入重复。相同的索赔编号本来就是一笔。
- 自动判定只负责最确定的区间。其余的交给人工,并在转交时一并提供依据。
- 每加入一条误报规则,都要一并写下会因此漏掉什么。连号规则可能会漏掉真的把同一张收据写了两次的情况。
- 判定必须可以重新计算。输入和规则版本相同,就应当得到相同的结果。
下一项实验要做什么
下一项实验使用的权重(0.45、0.35、0.20)、门槛(0.92、0.80)和容差(100 韩元、0 天)是本实验的假设。实际中,它们要根据过去的判定记录和调查人手每天的处理量来确定,并给规则版本编号,每次修改都记录下来。
你将亲自创建受理系统一天的索赔表,从完全重复开始,逐步叠加规范化、分块、相似度、容差,直到清除连号误报。评分器每次都会用不同的患者、医院、收据编号生成自己的索赔表,运行你的检测器并核对判定。最后用自己的表给出判定,并输出审核人员可以直接查看的审核清单和报告。