在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2136|回复: 5

[原创] 使用Perl脚本整理英文文章的词频

[复制链接]
发表于 2017-2-16 22:32:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

前段时间看到某公众号的一篇文章讲了如何使用软件整理几十本《经济学人》的词频。而自己也有类似的需求:工作中用到的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#[-&#161;°&#174;><:/=?!'\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

发表于 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 | 显示全部楼层
长知识了!
发表于 2017-3-1 13:01:18 | 显示全部楼层
厉害了,关注微信号学习
 楼主| 发表于 2017-3-8 19:11:48 | 显示全部楼层
回复 2# chenfengrugao


   学习了~
 楼主| 发表于 2017-3-8 19:13:00 | 显示全部楼层
回复 4# hlr1993


   多谢,一块进步~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 15:54 , Processed in 0.024207 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表