最近,碰到好多个在问怎么实现两列杂乱文本按“相似度”进行匹配的问题。也有大神给出一些VBA的解法——其实这个问题的关键不在于用Power Query还是用VBA,一般来说,VBA里面能写的算法,Power Query里面也都能实现,而且通常实现起来相对简单,并不需要特别专业的人员都能掌握。
最关键的是:“相似度”怎么定义?目前,最常见的说法应该是:相同的字数越多,代表相似度越高。
虽然就我的理解来看,这个定义并不是太可靠,但也许对于很多人来说,这个定义也能得到一些比较满意的匹配结果,所以,就搞一搞试试。
下面,我举个简单的例子以及在Power Query里的实现过程,供参考,是否是你想要的?又或者说,对于你的数据来说,相似度是怎么定义的?欢迎留言。
首先,看看要进行匹配的两列简单数据,如下图所示。
这两列数据比较简单,都添加到PowerQuery里,并在每个表后面增加一列相同的内容做合并查询以生成两个表的全部可能匹配项(具体操作方法可参考文章《PQ-综合实战:根据关键词确定订单最大体积重量比》,在此不赘述):
展开表后,分别对原表和对比表的名称进行拆解(关键函数:Text.ToList),如下图所示:
对拆解的内容提取相同的文字,函数也比较简单(List.Intersect),如下图所示:
相同的字提出来后,算占比也就不复杂了,我的计算方法是:相同的字数个数,除以两个名称中最长的字数个数。如果采用其他方法,请按需要修改即可,核心函数也就是List.Count和List.Max之类的基础函数。如下图所示。
接下来排序,加索引固定排序结果:
最后,分组并修改代码提取相似度最高的数据(每组第1行),如下图所示:
结果如下:
至此,整个操作过程完成,每一个步骤以及涉及的函数其实都不复杂,只要操练过我整理的系列文章,应该都很容易搞出来,当然,其中涉及的相关基础知识点还是比较多的,大概包括以下几个方面以及以往文章可参考例子:
1、合并查询构造两表间可能的全部对照表,参考文章《PQ-综合实战:根据关键词确定订单最大体积重量比》
2、函数Text.ToList、List.Intersect、List.Count、List.Max,参考文章《Power Query里的数值计算(聚合函数与操作)》
3、分组操作及修改代码,参考文章《动态分组合并同类项内容》
4、表中某行某列的提取,参考文章《重要!很重要!非常重要!理解PQ里的数据结构(二、行列引用)》
最后的最后,再说一下,类似这样的问题的出现,归根结底在于源头基础数据的不规范,虽然这种问题在很多企业看似难以避免,但是,如果不想办法去解决的话,后续再多的努力都难以弥补——所以,如果你遇到了这种问题,是马上搞尽脑汁加班加点去搞完它?还是先跟领导或同事谈一谈——“埋头苦干”、“任劳任怨”的精神,很多时候并不见得是对的。