记录链接(Record linkage)是一个用于融合不同数据集合的强大技巧。当我们处理一些字符输入错误或者拼写不一致的问题时,记录链接技巧变得尤为实用。记录链接的记录操作底层逻辑就是对字符串内的元素的插入、替换以及删除。可以实现这种算法的库有nltk,fuzzywuzzy,textdistance等等。我们这里使用fuzzywuzzy库。
|
|
上面例子比较了两个字符串‘Reeding’和‘Reading’的相似度,相似度是一个0-100的数字,数字越大代表相似度越高。fuzzywuzzy认为字符串‘Reeding’和‘Reading’的相似度为86。下面再来看两个比较一部分字符串的例子:
|
|
比较数组:
|
|
在对fuzzywuzzy库有一个基本的了解之后,下面正式进入对实际数据的操作演示。本文使用的数据为restaurant数据,数据包含了餐厅名称name,地址addr,所在城市city,电话phone和食物类型type。
数据下载地址:点击下载
|
|
通过查看餐厅的唯一类型,我们可以看到有一些类别其实是重复的,比如’american’ ‘america’ ‘american ( new )’ ‘mericano’ ‘americano’,这些其实是同一个类型的菜品american美国菜。可能是由于数据的录入错误导致一种类型的数据出现了很多种表达方式。我们当然可以使用.replace()
函数进行替换,但是每个不对等的字符串都需要单独批量替换就显得有点笨拙了,所以使用记录链接的方式去判断字符串的相似度来解决这个问题更加高效:
|
|
通过对比Out [5]和Out [6]的结果,可以看到在Out [5]中杂乱不堪的类别已经被我们根据字符串相似性的条件整理成了统一个类别。’american’ ‘america’ ‘american ( new )’ ‘mericano’ ‘americano’被统一整理成了‘american’,’asia’和’asian’被统一成了’asian’,’italian’ ‘italia’ ‘italiano’被统一成了’italian’。
记录链接(record linkage)和连接(join)的作用基本类似。不同的是,记录链接不需要数据完全匹配也可以对不同的dataframe进行合并。记录链接的基本操作思路是:
- 拿到两个数据框,例如Data A和Data B
- 生成配对
- 比较配对
- 为配生成相似度分数
- 连接数据
例如我们拿到一个新的数据框restaurants_new,这个数据框中我们发现了有一些餐厅的名称存在一些数据错误。这时,我们就需要记录链接来合并两个数据框:
|
|
在生成我们的成对数据之后,接下来需要做的是比较每列的数据,然后为比较打上相似分数,最后合并数据框。
|
|
变量里等于1代表是潜在的匹配,0代表不匹配。根据我们的实际情况,我们需要‘city’,’type’和’name’三者都为1的时候,我们才能确定这两个数据框中的某两条餐厅数据为同一家餐厅。
|
|
借此,我们就完成了对两个df的记录链接的所有操作。