0

大きなテキストファイルを使用しているため、アルゴリズムの設計に大きな問題があります。単語のシーケンスを含むテキストファイルがあります。例えば

  1. 私の友人
  2. こんにちは私の友人
  3. 世界

2番目のファイルは文を含む大きな(ギガバイト)です。プログラムの目標は、単語(最初のファイル)を単語ごとに調べ、2番目のファイルで記号「+」を連結することです。

たとえば、入力として「hello my friendsoftheworld」「「hello+my + friends of the+world 」になる」

何かアイデアをお願いしますか?私はそれをPerlでプログラムしたいのですが、テキストでパフォーマンスがあります

私はこのスクリプトをPerlで実行しましたが、ファイルを何度も読み取るために遅すぎます.. :(これはPerlプログラムの例であり、機能しますが、遅すぎます

use strict;
use warnings;
use utf8;
use feature qw(:5.10); 
my ($in, $dico) = @ARGV;
die "Bad infile $in" if !-r $in;
die "Bad dicofile $dico" if !-r $dico;

# load dico
my @dico;
open(FICHIERNOUVELLES, ">resultat7.txt");
open my $DICO, "<", $dico or die "Can't open $dico for reading: $!\n";
# For all lines in the Dico
foreach my $line (<$DICO>) {
chomp($line);
# extract words
 if (my @word = split /\s+/, $line) {

 my $re = q{(^\s*|\s+)(}.(join q(\s+), map quotemeta, @word).q{)(\s+|\s*$)};

push @dico, qr/$re/;
}
}

 open my $IN, "<", $in or die "Can't open $in for reading: $!\n";
 my @word;

foreach my $line (<$IN>) {

 foreach my $dico (@dico) {

  while (my (undef, $sequence) = $line =~ /$dico/) {

  $sequence =~ s/\s+/+/g;
  $line =~ s/$dico/$1$sequence$3/;
  }
 }
print FICHIERNOUVELLES "$line";

 }
close(FICHIERNOUVELLES);
4

1 に答える 1

2

2番目のファイルを複数回読み取らないようにするための解決策は、最初にfile1から単語のセットを読み取り、データ構造に格納することです。

use File::Slurp;
my @lines = read_file($filename1);
my %replacements = map { my $c = $_; $c =~ s/ / + /g; ( $_ => $c ) } @lines; 

open (my $file2, "<", $filename2) or die "$!";
while (<$file2>) {
    chomp;
    foreach my $replacement (keys %replacements) {
        s/$replacement/$replacements{$replacement}/g;
    }
    print $_;
}
于 2013-03-27T13:46:38.803 に答える