Skip to content

Instantly share code, notes, and snippets.

@y-tag
Created April 21, 2013 14:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save y-tag/5429839 to your computer and use it in GitHub Desktop.
Save y-tag/5429839 to your computer and use it in GitHub Desktop.
#!/usr/local/bin/perl
use strict;
use warnings;
main();
sub main {
if (@ARGV < 1) {
print STDERR "Usage: $0 input_f\n";
exit 1;
}
my $input_f = shift @ARGV;
my $qid_rel_hash = {};
open(my $ifh , '<', $input_f) or die $!;
while (my $line = <$ifh>) {
chomp $line;
my ($rel, $qid, $features) = parse_line($line);
push @{$qid_rel_hash->{$qid}{$rel}}, $features;
}
close($ifh);
foreach my $qid (sort {$a <=> $b} keys %$qid_rel_hash) {
my @rel_array = sort {$b <=> $a} keys %{$qid_rel_hash->{$qid}};
foreach my $i (0..(int(@rel_array)-2)) {
my $rel1 = $rel_array[$i];
foreach my $j (($i+1)..(int(@rel_array)-1)) {
my $rel2 = $rel_array[$j];
foreach my $f1 (@{$qid_rel_hash->{$qid}{$rel1}}) {
foreach my $f2 (@{$qid_rel_hash->{$qid}{$rel2}}) {
my $diff = diff_features($f1, $f2);
my $diff_line = make_line($qid, 1, $diff);
print $diff_line, "\n" if $diff_line;
}
}
}
}
}
}
sub parse_line {
my ($line) = @_;
my ($subline) = split(/#/, $line);
$line = $subline;
my ($rel, $qkv, @rest) = split(/ /, $line);
my (undef, $qid) = split(/:/, $qkv);
my $features = {};
foreach my $kv (@rest) {
my ($k, $v) = split(/:/, $kv);
$features->{$k} = $v;
}
($rel, $qid, $features);
}
sub make_line {
my ($qid, $rel, $features) = @_;
my @tmp_array = map {join(":", $_, sprintf("%.6f", $features->{$_}))}
grep {$features->{$_}}
sort {$a <=> $b} keys %$features;
return unless @tmp_array;
join(" ", $rel, "qid:$qid", @tmp_array);
}
sub diff_features {
my ($f1, $f2) = @_;
my $diff = {};
foreach my $k (keys %$f1) {
$diff->{$k} = $f1->{$k};
}
foreach my $k (keys %$f2) {
$diff->{$k} -= $f2->{$k};
}
$diff;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment