Perl:单词的频率和单词的前十个列表

时间:2012-10-14 02:59:23

标签: perl

我正致力于使perl脚本正常工作,并且要注意我对此很新...

这是我想要实现的:制作一个带有.txt文件的脚本并计算文件中的每个单词。当计算时,如果文件中的前10个单词显示我计算的每个单词的次数,则单词会生成一个列表。

这就是我到目前为止所得到的,我已经能够使脚本计算出来的次数和出现的次数。现在我需要进入前十名,我不知道在哪里以及如何做到这一点。这是一个家庭作业,所以我不希望/期望你为我解决它,只是给我一些指示从哪里开始。

感谢您提前帮助


更新了15 oct

好吧,它正在整理一切,但是......

现在它只是在一行中打印所有内容。我需要它像这样打印:

4个字
3下一个字
2下一个字

嗯,你得到它..


我想我已经明白了......我想:P


......................................

#! /usr/bin/perl

use utf8;


print ("Vilken fil?\n");
my $filen = @ARGV ? shift(@ARGV) : <STDIN>;
chomp $filen;

my %freq;

open my $DATA, $filen or die "Hittade inte den filen!";


while(<$DATA>) {

    s/[;:()".,!?]/ /gio;    
    foreach $word(split(' ', lc $_)) {  
    $freq{$word}++;                  
     }
}

@listing = (sort { $freq{$b} <=> $freq{$a} } keys %freq)[0..9];
foreach my $word (@listing )
    { print $freq{$word}." $word\n"; };

3 个答案:

答案 0 :(得分:3)

查看Perl排序函数的文档:

http://perldoc.perl.org/functions/sort.html

它有一个表单,允许您指定一个代码块来定义元素的顺序。您可以使用此按频率按顺序排列列表,而不是按字母顺序排序。

文档包括这个例子:

# this sorts the %age hash by value instead of key
# using an in-line function
@eldest = sort { $age{$b} <=> $age{$a} } keys %age;

您应该能够根据自己的问题调整此模式。

获得前十名的最有效方法可能是跟踪前十名:每次计算一次计数,检查它是否属于前十名,如果是,那么将其插入正确的地方,可能会淘汰列表中的底部项目。这样,您只需要一次跟踪十个单词的顺序,无论字典有多大。不过,我不知道你是否需要这种额外的效率。

顺便说一下,我在几次求职面试中都看到过这样的问题,所以掌握这个问题是件好事。

答案 1 :(得分:2)

在Nate的答案基础上,您可以使用切片提取前10个元素:

  

@eldest =(排序{$ age {$ b}&lt; =&gt; $ age {$ a}}键%年龄)[0..9];

答案 2 :(得分:-1)

哈,当我读完你的问题描述时,我知道这是某种家庭作业! :)

对于下一步,您必须扫描%count哈希并确定哪些单词的出现次数最多。

最天真的方式是在列表中扫描10次;每次,找到一个具有最高计数的那个并将其存储在前十个列表中,然后将其从%count中删除(或将其设置为0也可以)。

如果你想要更加雄心勃勃,你可以实现一个排序函数,对%count条目进行排序,然后10个最高值将在一起。

我的Perl很生疏,但Perl lib甚至可能为你提供一些排序功能。一般来说,浏览图书馆参考资料绝对值得您花时间熟悉可用的内容。