查看原文
其他

模糊匹配我只用这一招!

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王玉婷, 中南财经政法大学金融学院

本文编辑:王   彤

技术总编:余术玲

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元!


导言

不知道大家有没有这种体验?在使用merge命令合并两个数据集时,总要小心翼翼地保持ID变量一致,一旦有某个样本的ID变量在两个数据集中有些许不同,就无法实现完美合并。比如,在file1中一公司名称为“武汉字符串数据科技有限公司”,但在file2中公司名称为其简称“字符串科技”,此时merge命令完全派不上用场。如果这种情况在数据集中占比过大,就必须祭出字符串模糊匹配的杀器了——matchit命令,在我们以往的推文《matchit——解锁文本相似度的钥匙》中也为大家简单介绍过如何对同一数据集中的两列内容进行相似度匹配、对两个不同的数据集中的文本内容进行匹配 ,今天我们侧重介绍如何使用matchit命令提高匹配准确率。

粗糙的模糊匹配  

现在,我们先构造两个用于模糊匹配的dta文件。clear all
input id1 str100 firm1
1 "金隅集团"
2 "金堤科技"
3 "北京天眼查科技有限公司"
4 "北京拉勾科技有限公司"
5 "武汉字符串数据科技有限公司"
end
save file1,replace

clear all
input id2 str100 firm2
1 "字符串科技"
2 "天眼查"
3 "拉勾科技"
4 "北京金堤科技有限公司"
5 "北京金隅集团股份有限公司"
end
save file2,replace

可以看到,名为file1和file2的两个dta文件均包含2个变量和5个观测对象。id1和id2是分别用于追踪firm1和firm2观测对象的唯一标识变量,可以直接使用gen id1 = _n来生成。仔细观察firm1和firm2,发现其代表了相同的5家公司。比如firm1中第5个观测对象“武汉字符串数据科技有限公司”就是firm2中的第1个公司“字符串科技”。如此一来,各种精确匹配merge命令,frlink命令等都用不了了~~~
      既然如此,我只好请出模糊匹配的大佬——matchit。今天我们不直接讲干巴巴的语法,直接“上菜”,理解了这个小案例再去help matchit包你事半功倍!第二行主代码中,id1,firm1为master的唯一标识var和待模糊匹配的公司名称;id2,firm2为using file(file2)中的唯一标识var以及与firm1不完全一致的公司名称。

use file1,clear //将file1导入内存,则称file1为master
matchit id1 firm1 using file2.dta, idusing(id2) txtusing(firm2) //在内存生成新的数据集
*using文件的.dta后缀一定不能省略哦*

运行结果如下图所示:

      我们对新生成的“桥梁”数据集进一步保留与每个firm1匹配相似度(similscore)最高的firm2。

merge m:1 id1 using file1,nogen //避免遗漏file1的观测对象
merge m:1 id2 using file2 //避免遗漏file2的观测对象
gsort id1 -similscore //排序
by id1:keep if _n == 1 //对每个firm1保留similscore最大的firm2
匹配结果如下图所示。可以发现,有成功匹配的“武汉字符串数据科技有限公司”,也有匹配失败的“北京拉勾科技有限公司”,firm2中的“天眼查”甚至被认为没有与之对应的firm1,其similscore缺失的原因是matchit默认仅显示similscore>0.5的匹配(当然,你可以在options中更改)。


如何提高模糊匹配的精确度?

显然,最基本的matchit命令的准确率令人不太满意。幸运的是,该命令允许我们通过更改options选项提高匹配准确率。首先,matchit的similmethod选项允许我们选择适合样本数据的匹配模式,多达十余种,经过测试,本文认为默认的“bigram”模式最适合中文字符匹配。
      其次,weights选项有simple,log,root三种模式,不设置该选项即默认每个字为同样的权重,设置该项则对出现频率更低的字、词赋予更大的权重。比如将firm1中“北京天眼查科技有限公司”匹配为“北京金堤科技有限公司”的原因就是在两者中均出现的“北京”和“科技有限公司”与“天眼查”这种特别的字号具有相同的权重。经过测试,log模式更适合前述匹配情形。
      最后,我们还可以设置score选项更改相似度计算方式来提高准确率。该选项有三种模式,分别是默认的jaccard,simple和minsimple,经过测试,minsimple是前述情形最适合的模式,意在为匹配上的字符赋予更大的权重,而simple则刚好相反。
      综合上述分析,我们写出以下程序:

use file1,clear
matchit id1 firm1 using file2.dta, ///
idusing(id2) txtusing(firm2) weights(log) score(minsimple)
merge m:1 id1 using file1,nogen
merge m:1 id2 using file2
gsort id1 -similscore
by id1:keep if _n == 1

运行结果如下图所示:

       简直完美~~(^▽^)~~
      此外,其实reclink,strgroup等也能够实现模糊匹配,但与matchit的应用情形有所不同;nearmrg,rangejoin等命令还能够实现时间、日期的“模糊匹配”。
       最后,如此实用的命令安装也十分简单,双手奉上安装命令:

ssc install freqindex //matchit会用到该命令
ssc install matchit




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

利用tushare获取财务数据

爬虫实战|Selenium爬取微信公众号标题与链接

轻轻一点,就知有没有|rqrs命令介绍

强大的正则表达式

自动群发邮件(二)——附带附件

自动群发邮件--email和smtplib基本模块的使用

批量处理变量名和标签的小方法

计算工作日的小能手——workdays

Seminar | 企业错报与银行贷款合同

Seminar | 共同基金行业的性别歧视
Seminar | 来自女儿的塑造:高管、女性社会化与企业社会责任

小贴士:Markdown的基本语法

听说相貌也能量化 | 调用百度人脸检测API实现颜值打分

列出指定属性的变量|findname命令比ds命令

新一代的标签转码小能手
【爬虫实战】亚马逊网站Top100畅销书爬取

Json文件好帮手——JsonPath

数据转置pro之sxpose2
文件"搬家"小助手:mvfiles

pyecharts绘图——河流图展示

你知道MDPI期刊的热门题目吗?

文件合并你不行,mergemany来帮宁
关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存