Подсчитайте частоту слов и затем отсортируйте их

#regex #perl #count #words #word-frequency

#регулярное выражение #perl #подсчитайте #слова #частота слов

Вопрос:

Я пишу скрипт на Perl, в котором a должен обработать текст, а затем предоставить словарю частоты слов, а затем отсортировать словарь. Текст представляет собой выдержку из «Золотого жука» Эдгара По, и цель состоит в том, чтобы вычислить частоты всех слов. Но я делаю что-то неправильно, потому что не получаю выходных данных. Когда я делаю неправильно? Спасибо.

 open(TEXT, "goldenbug.txt") or die("File not found");
while(<TEXT>)
{
chomp;
$_=lc;
s/--/ /g;
s/  / /g;
s/[.,:;?"()]//g;

@word=split(/ /);
foreach $word (@words)
    {
        if( /(w )'W/ )
        {
            if($1 eq 'bug')
            {
                $word=~s/'//g;
            }
        }
        if( /W'(w )/)
        {
            if(($1 ne 'change') and ($1 ne 'em') and ($1 ne 'prentices'))
            {
                $word=~s/'//g;
            }
        }

        $dictionary{$word} =1;
    }
}

foreach $word(sort byDescendingValues keys %dictionary)
{
print "$word, $dictionary{$word}n";
}

sub byDescendingValues
{
$value=$dictionaty{$b} <=> $dictionary{$a};
if ($value==0)
{
return $a cmp $b
}
else
{
    return $value;
}
}
  

Комментарии:

1. можете ли вы также опубликовать небольшой список слов? также вы нигде не объявляете %dictionary…

Ответ №1:

В вашем коде есть:

 @word=split(/ /);
foreach $word (@words)
    {
  

Вы назвали массив как @word во время разделения, но вы используете массив @words в цикле for.

 @word=split(/ /);
  

должно быть

 @words=split(/ /);
  

Еще одна опечатка в byDescendingValues процедуре:

 $value=$dictionaty{$b} <=> $dictionary{$a};
                ^^
  

Как было предложено в другом ответе, вам действительно следует добавить

 use strict;
use warnings;
  

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

Комментарии:

1. но как правильно отсортировать слова?

Ответ №2:

Помимо того, что вы путаете @word и @words, вы также используете $dictionaty вместо $ dictionary. Разумно

 use strict;
use warnings;
  

в начале вашей программы и объявите все ваши переменные с помощью my . Таким образом, подобные этому тривиальные ошибки исправляются самим Perl.

Комментарии:

1. Строго говоря, ошибки выделены, а не исправлены