想比较文本相似度吗?也许这两个命令可以帮你

2017-03-28 付彩月 爬虫俱乐部 爬虫俱乐部

今天介绍两个命令,都是用来计算字符串之间的相似度,具体往下看。


strdist

该命令用于计算Levenshtein距离,又叫编辑距离。是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。


语法为:

strdist {varname1|"string1"} {varname2|"string2"} [if] [in] [, generate(newvar) ]

如果是对两个字符串计算编辑距离,记得要加引号。


举个栗子。

sysuse census

strdist state "west virginia" , gen(wvdist)

list state wvdist in 1/5


比如,state的第5个观测值“California”要转换成“westvirginia”,先插入wes三个字母,再将Cal三个字母分别替换为t、空格和v,字母i匹配成功不做编辑,再将for分别替换为rgi。总共进行了9次编辑操作,所以算得编辑距离为9


jarowinkler


该命令用于计算两个字符串变量之间Jaro-Winkler距离,Jaro-Winkler距离越大,相似度越高,最小为0,表示两个字符串完全不相似;最大为1,表示完全相同。Jaro-Winkler 距离是Jaro距离的一个扩展,而Jaro距离(Jaro 1989;1995)据说是用来判定健康记录上两个名字是否相同,也有说是用于人口普查,爬虫君的洛阳铲使得不好,留待他人考察。今儿只讲Jaro-Winkler距离的具体定义。


先说Jaro距离。定义如下


s1s2分别是字符串s1s2的长度,m是匹配的字符数,t是换位的数目。换位的数目t,简单来说就是不同顺序的匹配字符的数目的一半,比如QIIQ,匹配但顺序不同,t=2/2=1,换位数就是1


举个栗子。organize和organise,s1和s2都是8,m为7,t为0,则Jaro距离为0.9167。


Jaro-Winkler则给予了起始部分就相同的字符串更高的分数,他定义了一个前缀p,给予两个字符串,如果前缀部分有长度为小写L的部分相同,则Jaro-Winkler Distance为:

小写L是前缀的相同的长度,但是规定最大为4,如果前缀相同的长度超出4,也按4计算;p则是调整分数的常数,规定不能超过0.25,不然可能出现dw大于1的情况,这个常数默认值为0.1


命令语法:

jarowinkler varname1 varname2 [,generate(newvar) jaroonly(newvar) pwinkler(x) ]


计算出的Jaro-Winkler距离的变量名可以在generate()中定义,jaroonly()选项计算Jaro距离,pwinkler()选项可以自定义调整分数的常数p,不可大于0.25,不填则默认为0.1


举个栗子。

jarowinkler state state3,gen(dist_jw) jaroonly(dist_jw1) pwinkler(0.2)

list state state3 dist_jw dist_jw1 in 1/5


可以看出,经过调整后,Jaro-Winkler距离比Jaro距离给了有相同前缀的字符串更高的分数。


在计算出Jaro距离后,由于变量statestate3的观测值前缀的相同的长度超过4,所以按4计算,我们在命令中给p赋值为0.2,所以Jaro-Winkler距离等于Jaro距离加上0.8倍的1Jaro距离。

gen dist=dist_jw1+0.8*(1-dist_jw1)

list dist dist_jw dist_jw1 in 1/5


看,我们自行计算的Jaro-Winkler距离和命令计算Jaro-Winkler距离的结果是一样的。


这些字符串相似度算法在处理拉丁文字的文本匹配时,都能起到非常好的效果。它们本身最初的发明者也是为了解决拉丁文字中遇到的问题。然而,对于象形文字相似度计算,比如说中文,这些算法就显得捉襟见肘了。

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

                        文字编辑:强宇曦

技术总编:刘贝贝



往期推文推荐:

1.中国高校财经、管理与综合类期刊灌水排行榜

2.关于RTF你不知道的命令

3.关于RTF你不知道的命令之番外篇

4.免费事件研究,一片片从邮局寄来

5.免费的股价同步性,一片片从邮局寄来

6.Stata叫你回家听音乐了!

7.一言不合就用stata写邮件(Outlook/Foxmail)

8.听说你想知道怎么用stata画地图?

9.I have a Stata, I have a python

10.I have a Stata, I have a Python之二——pdf转word




关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

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

欢迎关注爬虫俱乐部

微信扫一扫
关注该公众号