文中に一緒に出現する単語群の出現頻度を分析しています。
各グループは 3 つの単語で構成されており、それらの頻度を計算する必要があります。
例:今は休暇中なので、パーティーをするのに良い時期です。
期待される出力:
this is a - 2
is a good - 1
a good time - 1
等々。
うまく機能するスクリプトを作成しました。これは、頻度を出力し、降順で並べ替えます。
ファイルから一度に 1 行ずつ読み取ることで機能します。各行を小文字に変換し、個々の単語に分割してから配列を形成します。
次に、左から一度に 3 つの単語を選択し、出現回数を格納するハッシュを形成し続けます。完了したら、配列の左端の要素をシフトし、配列が 3 つ以上の単語で構成されるまで繰り返します。
質問が更新されました:
問題は、1,000 万行を超えるファイルでこのスクリプトを使用したいということです。
いくつかのテストを実行した後、入力ファイルの行数が 400K を超えると機能しないことがわかりました。
このスクリプトのメモリ効率を高めるにはどうすればよいですか?
fxzuz の提案に感謝しますが、今はこのスクリプトをより大きなファイルで動作させたいと思っています :)
#!/usr/bin/perl
use strict;
use warnings;
print "Enter the File name: ";
my $input = <STDIN>;
chomp $input;
open INPUT, '<', $input
or die("Couldn't open the file, $input with error: $!\n");
my %c;
while (my $line = <INPUT>) {
chomp $line;
my @x = map lc, split /\W+/, join "", $line;
while (@x>3) {
$c{"@x[0..2]"}++;
shift @x;
}
}
foreach $key (sort {$c{$b} <=> $c{$a}} keys %c) {
if($c{$key} > 20) {
print $key." - ".$c{$key}."\n";
}
}
close INPUT;
これはうまく機能し、単語のグループを頻度の降順で出力します。20 回以上出現する単語のグループのみを出力します。
では、100 万行または 1000 万行を超えるファイルでこれを機能させるにはどうすればよいでしょうか。
また、Linux で top コマンドを使用してこのスクリプトを実行しているときに perl のメモリと CPU 使用率を確認したところ、スクリプトが 400K 行で構成されるファイルで実行されている間、CPU 使用率が 100% に達し、メモリ使用率が 90% 近くになることがわかりました。
そのため、100 万行のファイルで動作させることは現実的ではありません。perl プロセスがハングアップするためです。
このコードのメモリ効率を高めるにはどうすればよいですか?