查看原文
其他

matchit——解锁文本相似度的钥匙

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

本文作者:孙晓玲

文字编辑:朱巧利

技术总编:张计宝

导读

当下,模糊匹配在查询和配对操作中起着重要的作用,进行模糊匹配就需要先计算匹配对象之间的相似度。在我们以往的推文(《比较文本相似度吗?也许这两个命令可以帮你》)中也为大家介绍过两个比较文本相似度的命令strdistjarowinkler,今天将为大家介绍的matchit也是可以计算文本相似度的一个非常好用的命令。不同于前两个命令,matchit的功能更加强大,不仅可以对同一数据集中的两列内容进行相似度匹配,还可以对两个不同的数据集中的文本内容进行匹配。


一、matchit的优势


一般计算短文本的相似度使用的是编辑距离(Levenshtein距离),而编辑距离不考虑文本的顺序和含义这样得到的相似度经常是不理想的,strdist命令采用的就是编辑距离。matchit采用的是矢量分解算法和语音算法,极大的提高了语意和拼写准确性。matchit是一个外部命令,使用之前需要进行安装。

ssc install matchit

安装过后直接使用,会发生如下图所示的报错提示。



因此,在正式使用之前,还需要安装freqindex命令,在matchit的说明文档中也有介绍。

ssc install freqindex


二、同一数据集的两列匹配模式


matchit可以对同一数据集中的两列数据进行相似度匹配,其基本语法如下:

matchit varname1varname2 [, options]

其中,varname1varname2是所选的进行匹配的两个列的变量名,还可以设置一些选项对匹配结果进行适当约束。下面,用input生成一个两列的数据,对这两列的内容进行相似度匹配。

clearinput id str100 string1 str100 string21 "我喜欢吃苹果" "她喜欢吃香蕉"2 "好好学习 天天向上" "勤奋好学"3 "John Smith" "John"4 "中南财经政法大学" "中南财大"endcompressmatchit string1 string2list state state2 similscore



如图所示,第三列similscore就是string1string2的文本相似度,例子中列出了常见的几种相似度匹配类型“相似语意匹配”、“同类词匹配”、“缩写”、“简写”。从结果中也可以看出,这里的相似度考虑到了语意相似,不同于编辑距离算法。


三、两个数据集的内容匹配


matchit的另一匹配模式可以对两个数据集进行匹配,这时两个数据集都需有索引变量,其基本语法如下:

matchit idmaster txtmaster using filename.dta, idusing(varname) txtusing(varname) [options]

其中,idmaster表示当前文件的索引变量,txtmaster表示当前文件的匹配变量;filename.dta是所需匹配的另一文件;idusingtxtusing括号中分别为匹配文件的索引变量和匹配变量。

在数据清洗过程中,我们经常会碰到数据合并问题。mergejoinbyappend等命令能帮助我们合并数据,但有时候我们需要合并的数据并不规整,两个数据集的来源不同,观测值的“标志名”就不一样。例如上面的例子中,“中南财经政法大学”又可以简称为“中南财大”,这时候就无法直接用merge等命令将数据合并。这时候matchit就可以为我们提供帮助。下面,小编将以一个简单的例子为大家演示这个过程。

首先,生成所需的两个数据集。小编生成了几个兴趣协会在2018年和2019年的成员数目横截面数据集,分别保存为“club18.dta”和“club19.dta”文件。在这两个数据集中不同协会的索引和名称不相同,18年的数据集中协会名为全名,如“字符串学习吧”,在19年的数据集中协会名为缩写,如“字符串吧”。

clearinput id str60 name year members181 "字符串学习吧" 2018 3562 "STATA爱好俱乐部" 2018 2783 "PYTHON交流协会" 2018 4354 "Stata&Python 数据分析" 2018 2455 "计量学习研讨会" 2018 3216 "读书爱好者乐园" 2018 532endsave club18, replace compress
clearinput id1 str60 logs year members191 "读书乐园" 2019 5432 "STATA俱乐部" 2019 3113 "Stata&Python" 2019 3674 "字符串吧" 2019 4365 "PYTHON协会" 2019 5326 "计量研讨会" 2019 3897 "美术室" 2019 1348 "运动群" 2019 78endsave club19, replacecompress




得到数据集后,先对两个数据集进行相似度匹配,匹配结果如下。

matchit id1 logs using club18.dta, idu(id) txtu(name) override



从图中可以看到,我们已经将两个数据集中的协会正确匹配,并得到对应的索引对。override选项保证匹配时不因未保存内存中的数据而报错。接下来就可以通过对应的索引将两年的数据合并。

merge m:m id1 using club19.dta,generate(merge1)merge m:m id using club18.dtacompress



这样一番操作后,两个数据集就完美合并了。再处理一下就可以进行后续分析啦。

关于matchit介绍就写到这里了,感兴趣的读者快来试试吧~







对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
基于广义线性模型的机器学习算法——线性回归
听说你会魔法?
dummieslab——从分类变量到虚拟变量的“一步之遥”
线上Python课程都面向哪些方向?
子类与父类
用requests库爬取淘宝数据
WordStat—Stata的文本分析小助手
数据筛选理还乱,datacheck能诊断

如何用简单的手法绘制出不一样的海外疫情趋势图

matplotlib绘制数学函数
gen的再进化
Stata版大家来找茬—cfout就够了
另辟蹊径js逆向爬取百度翻译
可迭代对象、迭代器、生成器傻傻分不清楚
Ftools命令组之fegen命令介绍
提升效率的利器——如何用labvarch批量修改变量标签
二进制序列类型——bytes()、bytearray()

关于我们



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

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

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

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