使用Perl脚本整理英文文章的词频

发布: 2017-2-16 22:32 | 作者: duchuixinhu | 来源: EETOP 赛灵思(Xilinx) 社区

前段时间看到某公众号的一篇文章讲了如何使用软件整理几十本《经济学人》的词频。而自己也有类似的需求:工作中用到的user guide中有很多出现频率很高但又生僻的单词。

根据这个需求,自己使用perl语言编写了如下脚本。此脚本可以快速的整理出文章的词频;可以根据单词出现的频率排序;可以让一些简单常用的单词不出现在最终结果中。

说明:由于本脚本是在linux系统下编写的,为了方便,脚本中调用了一些linux 程序“cat/sort/uniq”,因此此脚本不能直接在windows下运行。

txt2word.pl

!/usr/bin/perl

open ("INPUT","<","$ARGV[0]") ; 【读入要解析的文章】

open ("OUTPUT",">","$ARGV[0].word") ;


while (<INPUT>) {

    chomp ;

    s#[-¡°®><:/=?!'\t.,;{}\(\)\[\]\\\"\*\^`]# #g;【将一些标点符号替换为空格】

    s#[\r\n]# #g;

    @word = split / /, $_;

    for ($i = 0; $i <= $#word; $i++) {


if($word[$i] =~ /[a-zA-Z]+/) {


    $word[$i] =~ s/[0-9]//g;


    $word[$i] =~ s/^-//;


    $word[$i] =~ s/-$//;


    @letter = split //, $word[$i];


    if (($#letter > 3) && !($word[$i] =~ /_/)) {【只输出大于4个字符的单词,且不输出有下划线的单词,这个地方可以根据需求灵活修改】


print OUTPUT "\L$word[$i]\n";


    }


}

    }

}


close (INPUT);

close (OUTPUT);

【下面两行调用了linux的命令:cat/sort/uniq】

system "cat $ARGV[0].word | sort | uniq -c > $ARGV[0].word.su" ;

system "cat $ARGV[0].word.su | sort -nr > $ARGV[0].word.sus";


【下面代码的作用是将$ARGV[1](容易常见单词列表)中的单词不输出到最终结果中】

open ("DELF","<","$ARGV[1]");

open ("NEWF","<","$ARGV[0].word.sus");

open ("OUTPUTF",">","$ARGV[0].word.susd");

@delWord = <DELF>;

for ($i = 0; $i <= $#delWord; $i++) {

    chomp $delWord[$i];

}


while (<NEWF>) {

    $line = $_ ;

    m/\d+ (\w+)/;

    $word = $1 ;

    $flag = 0;

    for ($i = 0; $i <= $#delWord; $i++) {


if($word eq $delWord[$i]) {


    $flag = 1;


    last ;


}

    }

    if ($flag == 0) {


print OUTPUTF "$line";

    }

}


使用方法:./txt2word.pl  Harry_potter.txt  easy.lst

脚本位置:http://pan.baidu.com/s/1mhChzmS  

本人初学perl,可以加微信公众号一块交流:32768Hz

本人微信号:Hz32768


qrcode_for_gh_d79c9dcc6b18_258.jpg

chenfengrugao (2017-2-21 15:04:47)
cat $ARGV[0].word | sort | uniq -c > $ARGV[0].word.su
这样的排序可以用哈希数组代替。

用哈希数组存储,key为单词本身,value为每个词出现的次数。
foreach my $word (@word){
    if(exists $db{"$word"}){
        $db{"$word"} ++;
   }else{
        $db{"$word"} = 1;
   }
}
西鄙人 (2017-2-23 09:08:19)
长知识了!
hlr1993 (2017-3-01 13:01:18)
厉害了,关注微信号学习
duchuixinhu (2017-3-08 19:11:48)
回复 2# chenfengrugao


   学习了~
duchuixinhu (2017-3-08 19:13:00)
回复 4# hlr1993


   多谢,一块进步~

网络资源