Perl: сопоставление с образцом для пары сравнения строк - PullRequest
0 голосов
/ 20 марта 2011

У меня проблема с подсчетом большинства выбранных результатов для каждой пары строк. мой код: кажется, просто считать, если пользователь выбирает sysA, sysB или оба без учета пары строк. У меня также есть проблема, чтобы сделать несколько сравнений и иметь дело с 7 пользователями для каждой пары.

( $file = <INFILE> ) {
@field = parse_csv($file);
chomp(@field);
@query = $field[1];

for($i=0;$i<@query;++$i) {
    if ( ($field[2] eq $method) || ($field[3] eq $method)){
    if ( $field[4] eq $field[2]) {
    print "$query[$i]: $field[2], $field[3], $field[4]\n";
    $counta++;
    } 
    if ( $field[4] eq $field[3]) {
    print "$query[$i]: $field[2], $field[3]: $field[4]\n";
    $countb++;
    }
    if ( $field[4] eq ($field[2] && $field[3])) {
    #print "$query[$i]: $field[2]$field[3]\n";
    $countc++;

}

данные: для каждого запроса у меня есть 3 различные комбинации сравнения строк.

  • Сравнение ( "Lucene-STD-отн", "Lucene-Нолен-р-р");
  • Сравнение ( "Lucene-Нолен-р-р", "Lucene-STD-отн");
  • Сравнение ( "Lucene-Нолен-р-р", "случайный");
  • сравнение ("random", "lucene-noLen-rr");
  • Сравнение ( "Lucene-Нолен-р-р", "Lucene-Нолен-отн");
  • Сравнение ( "Lucene-Нолен-отн", "Lucene-Нолен-р-р");

пример данных для одной пары (7 пользователей оценивают для каждой пары):

  • user1, мужчина, Lucene-STD-отн, случайный, Lucene-станд-relrandom
    • user2, мужчина, Lucene-STD-отн, случайный, Lucene-STD-отн
    • user3, мужчина, Lucene-STD-отн, случайный, Lucene-STD-отн
    • user4, мужчина, Lucene-STD-отн, случайный, Lucene-STD-отн
    • USER5, мужчина, Lucene-STD-отн, случайный, Lucene-STD-relrandom
    • user6, мужчина, Lucene-STD-отн, случайный, Lucene-STD-отн
    • user7, мужчина, Lucene-STD-отн, случайный, Lucene-STD-отн

Требуется пример вывода: запрос 1: модели фитнеса для мужчин

  • lucene-std-rel: 5, случайный: 0, оба: 2 ---> большинство: lucene-std-rel

любая помощь очень ценится.

Ответы [ 2 ]

2 голосов
/ 20 марта 2011

Ну, не делая это более сложным, чем вы просили, вот то, что я придумал в качестве возможного подхода.

#!/usr/bin/perl
use strict;

my %counter = ( "A" => 0, "B" => 0, "AB" => 0, "majority" => 0);

while(<DATA>){

    chomp;
    next unless $_;
    my ($workerId,$query,$sys1,$sys2,$resultSelected) = split(',');

    $counter{$resultSelected}++;

}
$counter{'majority'} = (sort {$counter{$b} <=> $counter{$a}} keys %counter)[0];
print "A: $counter{'A'} B: $counter{'B'} both(AB): $counter{'AB'} majority: $counter{'majority'}\n";


__END__

user1,male,A,B,A

user2,male,A,B,AB

user3,male,A,B,B

user4,male,A,B,A

user5,male,A,B,A

Вывод этого: A: 3 B: 1 оба (AB): 1 большинство: A

Мне не кажется, что мой пример для вас полностью посвящен идее существования более одного типа с «большинством».Например, если A и B равны 9, я ожидаю, что они оба будут перечислены там.Я не удосужился сделать это, поскольку ты не просил, но, надеюсь, это поможет тебе выбрать правильный путь.

0 голосов
/ 20 марта 2011
open( INFILE, "compare.csv" ) or die("Can not open input file: $!");

while ( $file = <INFILE> ) {
@field = parse_csv($file);
chomp(@field);
@query = $field[1];

for($i=0;$i<@query;++$i) {
    if ( ($field[2] eq $method) || ($field[3] eq $method)){
    if ( $field[4] eq $field[2]) {
    print "$query[$i]: $field[2], $field[3], $field[4]\n";
    $counta++;
    } 
    if ( $field[4] eq $field[3]) {
    print "$query[$i]: $field[2], $field[3]: $field[4]\n";
    $countb++;
    }
    if ( $field[4] eq ($field[2] && $field[3])) {
    #print "$query[$i]: $field[2]$field[3]\n";
    $countc++;

}

} 

}

sub parse_csv {my $ text = shift;мой @new = ();нажать (@new, $ +), пока $ text = ~ m {"([^ \" \] (?: \. [^ \ "\] ) *)" ,?|([^,] +) ,?|,} gx;push (@new, undef) if substr ($ text, -1, 1) eq ',';return @new;} `

...