Удаление стоп-слов и сохранение нового файла Perl - PullRequest
1 голос
/ 02 марта 2011

Я создал файл Perl для загрузки в массив «Стоп слов».

Затем я загружаю в каталог файлы с «.ner», содержащиеся в нем. Каждый файл открывается, и каждое слово разделяется и сравнивается со словами в файле остановки. Если слово соответствует слову, оно заменяется на «» (ничего - и удаляется) Затем я копирую файл в другое место. Так что я могу различать файлы со стоп-словами и файлы без. Но изменит ли это файл так, чтобы теперь он не содержал стоп-слов, или он вернется обратно к оригиналу?

#!/usr/bin/perl

#use strict;
#use warnings;

my @stops;
my @file;

use File::Copy;

open( STOPWORD, "/Users/jen/stopWordList.txt" ) or die "Can't Open: $!\n";

@stops = <STOPWORD>;
while (<STOPWORD>)    #read each line into $_
{
    chomp @stops;     # Remove newline from $_
    push @stops, $_;  # add the line to @triggers
}

close STOPWORD;

$dirtoget="/Users/jen/temp/";

opendir(IMD, $dirtoget) || die("Cannot open directory");

@thefiles= readdir(IMD);

foreach $f (@thefiles){
    if ($f =~ m/\.ner$/){
        print $f,"\n";

        open (FILE, "/Users/jen/temp/$f")or die"Cannot open FILE"; 

        if ( FILE eq "" ) {
            close FILE;
        }
        else{
            while (<FILE>) {

               foreach $word(split(/\|/)){

                    foreach $x (@stops) {
                       if  ($x =~ m/\b\Q$word\E\b/) {
                            $word = '';   
             copy("/Users/jen/temp/$f","/Users/jen/correct/$f")or die "Copy failed: $!";
                    close FILE;
                    } 
                    }
                }
            }
        }
    }
}
closedir(IMD);
exit 0;

Формат файла, который я разделяю и сравниваю, выглядит следующим образом:

'<title>|NN|O Woman|NNP|O jumped|VBD|O for|IN|O life|NN|O after|IN|O firebomb|NN|O attack|NN|O -|:|O National|NNP|I-ORG News|NNP|I-ORG ,|,|I-ORG Frontpage|NNP|I-ORG -|:|I-ORG Independent.ie</title>|NNP|'

Должен ли я указать, где слова должны быть разделены, т.е.

Ответы [ 3 ]

2 голосов
/ 02 марта 2011

Вы должны ВСЕГДА использовать: используйте строгий;используйте предупреждения;

используйте три открытых аргумента и тестируйте открытие на неудачу.

Как сказано codaddict A split with no arguments is equivalent to split(' ', $_).

Вот предложение для выполнения работы (насколько яхорошо понял что хотел).

#!/usr/bin/perl
use strict;
use warnings;
use 5.10.1;

my @stops = qw(put here your stop words);
my %stops = map{$_ => 1} @stops;

my @thefiles;

my $path = '/Users/jen/temp/';
my $out = $path.'outputfile';
open my $fout, '>', $out or die "can't open '$out' for writing : $!";

foreach my $file(@thefiles) {
    next unless $file =~ /\.ner$/;
    open my $fh, '<', $path.$file or die "can't open '$file' for reading : $!";
    my @lines = <$file>;
    close $fh;
    foreach my $line(@lines) {
        my @words = split/\|/,$line;
        foreach my $word(@words) {
            $word = '' if exists $stops{$word};
        }
        print $fout join '|',@words;
    }
}
close $out;
1 голос
/ 02 марта 2011

A split без аргументов эквивалентно split(' ', $_).

Поскольку вы хотите, чтобы линии были разбиты на |, вам нужно сделать:

split/\|/
0 голосов
/ 08 марта 2011

@ jenniem001

open FILE, ("<$fh")||die("cant");undef $/;my $whole_file = <FILE>;foreach my $word (@words){$whole_file=~s/\b\Q$word\E\b//ig;}open FILE (">>$duplicate")||die("cant");print FILE $whole_file;

Это удалит остановки из вашего файла и создаст дубликат. Просто позвоните, дайте $ дубликату имя:)

...