模糊匹配我只用这一招!
本文作者:王玉婷, 中南财经政法大学金融学院
本文编辑:王 彤
技术总编:余术玲
爬虫俱乐部云端课程
导言
粗糙的模糊匹配
现在,我们先构造两个用于模糊匹配的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
利用tushare获取财务数据
爬虫实战|Selenium爬取微信公众号标题与链接
强大的正则表达式
自动群发邮件(二)——附带附件
自动群发邮件--email和smtplib基本模块的使用
计算工作日的小能手——workdays
Seminar | 企业错报与银行贷款合同
小贴士:Markdown的基本语法
听说相貌也能量化 | 调用百度人脸检测API实现颜值打分
列出指定属性的变量|findname命令比ds命令
Json文件好帮手——JsonPath
pyecharts绘图——河流图展示
你知道MDPI期刊的热门题目吗?
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。