Perl: мне нужно объединить элементы массива в наборах по два, чтобы отсортировать выходные данные по частоте - PullRequest
1 голос
/ 27 мая 2011

Дайте мне знать, если мне нужно сделать это более кратким, если у вас нет времени, просто ответьте на вопрос выше и пропустите следующие слова:

Я просто хотел, чтобы вы полностью поняли проблему.ОГРОМНОЕ СПАСИБО.

ПРЕДПОСЫЛКИ: Я делаю поисковую систему (это только небольшая часть кода ... поэтому она может быть чувствительной к изменениям ... не ваша проблема).Поисковая система должна выводить все предложения, соответствующие определенным критериям.Таким образом, если предложение включает правильные термины, оно будет помещено в подзаголовок, который находится под большим заголовком (заглавными буквами).Заголовок шапки отсортирован по алфавиту.Я хочу, чтобы подзаголовки были отсортированы по частоте.

ЦЕЛЬ: Я думал о сортировке по частоте, объединяя все соответствующие совпадения с подзаголовком, и затем каждый элемент подзаголовка с наибольшим идет первым.КАК МНЕ ЭТО СДЕЛАТЬ?(Например, $ array [0] и $ array [1] необходимо объединить)

АПОЛОГИЯ: Я новичок в Perl и на этом сайте, поэтому я не уверен, что этот формат слишком длинный ..Я уверен и сожалею, что мой код сырой, но он работает

ЗДЕСЬ МЫ ИДЕМ:

LEGEND1: $ sortedallgramfunc имеет вид: XCOMP

LEGEND2: $заголовки (подзаголовки) имеют вид: xcomp расходы: ход

LEGEND3: $ sentmatchesимеет форму: MATCH # 1 Отправлено.29 Чтобы приобрести эти органические молекулы, животные должны - потратить - энергию на переместить сами

Если подзаголовок также имеет МАТЧ №2, то он и все связанные с ним предложения должны быть напечатаныперед подзаголовком только с 1 совпадением

foreach my $sortedallgramfunc (@sortedallgramfunc) {
my @sepmatches; ## MOVED DOWN HERE TO TEST, MAYBE MOVE BACK depending on sol'n
print ("\n",uc $sortedallgramfunc,"\n\n");# Which gramfunc is being shown?

for (my $l=0; $l <= @headmatches; $l++) {
    if (defined( $headmatches[$l] ) and $headmatches[$l] =~ /$sortedallgramfunc/) {

        unless ($seenmatches{ $headmatches[$l] }++) {
            push (@sepmatches, $headmatches[$l]);
            my $count = 1;
            my @allsents; ## use for all sents that go under heading, add to heading to get @allmatches
            for (my $m=0; $m <= @sentmatches; $m++) {
                if ( defined( $sentmatches[$m]) and $sentmatches[$m] =~ /\s\S\S$firstmatches[$l]\S\S\s/ and $sentmatches[$m] =~ /\s\S\S$secondmatches[$l]\S\S\s/) { ##We know $l and $m are matching

                    push (@allsents, "MATCH #$count $sentmatches[$m]"); # unless $seens{ $sentmatches[$m] }++);
                    $count++;

                }
            }
            push (@sepmatches, @allsents);

            ##$sepmatches[0] is header, [1] is all sentences etc. EVEN - header, ODD - sent
            ## NOW WANT TO join headers and sentences (0 and 1 etc.) in @allmatches<====
             # SO I can us the following line to hopefully sort by frequency of matches under each subheading: @sortedallmatches = sort {length $a cmp length $b } @allmatches;

        }
    }
}print @sepmatches;
}

1 Ответ

4 голосов
/ 27 мая 2011

Вы, вероятно, хотите natatime List :: MoreUtil.Это дубликат многих других вопросов в том же духе, таких как Как читать два элемента за раз в цикле Perl Perach? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...