解释Perl中的Jaro-Winkler分数 - Stata中是否有替代品?

时间:2013-02-22 15:52:45

标签: perl statistics stata jaro-winkler

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')?

1 个答案:

答案 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)

并玩弄门槛。

我认为不存在标准,这些程序仍然需要大量的手工工作。