Jaro-Winkler得分应该多大才能说这两个字符串可能相似,是否存在行业标准?
我有一个字符串列表,我想看看它们中的任何一个是否是詹姆斯这个名字的合理排版错误。我使用了用C语言编写的perl模块,反过来,我从stata中的数据集中收到了它的字符串。 (所以,如果有一个Stata模块,我会全力以赴!)
这是我到目前为止在perl中编写的代码,用于与字符串James进行比较。
#!/usr/bin/perl
use 5.10.0;
use Text::JaroWinkler qw( strcmp95 );
use List::Util qw(min max);
open( my $l, '<', 'Strings.txt' ) or die "Can't open locations: $!";
open( my $o, '>', 'JW.txt' ) or die "Can't open locations: $!";
while ( my $line = <$l> ) {
chomp($line);
my $length = min(length($line),length('James'));
my $jarow = strcmp95($line, 'JAMES', $length);
print "$line,'JAMES',$jarow,\n" ;
print( $o ("$line,'JAMES',$jarow"),"\n" );
}
close $o;
我也不确定我是否正确或有效地解释了Jaro-Winkler函数的第3个参数。也许我应该做长度('JAMES')?
答案 0 :(得分:2)
尝试使用来自SSC的用户编写的strgroup
进行匹配,使用Levenshtein distance。它附带了另一个名为levenshtein
的命令,您可以使用它来执行此操作。一些玩具代码可以给你一个想法:
ssc install strgroup
input str8 names
Bob
James
Jim
Jameson
end
gen james = "James"
levenshtein names james, gen(LD)
然后,您可以按LD排序,以了解在您的情况下哪些方法可能效果很好。
另一种方法是这样做,为你创建群组:
strgroup names , gen(group) threshold(0.5)
并玩弄门槛。
我认为不存在标准,这些程序仍然需要大量的手工工作。