2014-11-08 5 views
0

Я использую этот скрипт для удаления игнорируемых слов в Perl, я бег на Windows, и я не мог найти совместимой версии:Perl удалить игнорируемые слова из строки

Lingua::EN::StopWordList 
Lingua::StopWords qw(getStopWords) 

У меня есть массив стоп-слов, но как только я использую REGEX ниже, я потеряю критическое белое пространство, которое заставляет слова сталкиваться. Обратите внимание, что каждое слово в массиве Stop-Word имеет два пробела: один справа и один слева.

Как эффективно удалить стоп-слова без потери важных пробелов?

use strict; 
use warnings; 
use utf8; 
use IO::File; 
use String::Util 'trim'; 

my $inFile = "C:\\Users\\David\\Downloads\\InfoRet\\Explore the ways to get better grades.txt"; 
my $inFh = new IO::File $inFile, "r"; 
my $lineNum = 0; 
my $line = undef; 
my $loc = undef; 
my $str = undef; 

my @stopList = (" the ", " a ", " an ", " of ", " and ", " on ", " in ", " by ", " with ", " at ", " after ", " into ", " their ", " is ", " that ", " they ", " for ", " to ", " it ", " them ", " which "); 

for(my $i = 1; $i <= 4; $i++) { 
    <$inFh> 
} 

while($line = <$inFh>) { 
    $lineNum++; 
    chomp $line; 
    $line =~ s/[\$#@~!&*()\[\];.,:?^`\\\/]+//g; 

    for my $planet (@stopList) { 
     $loc = index($line, $planet); 
     if($loc!=(-1)) { 
      #$line =~ s/$str//g; 
      $line =~ s/$planet//g; 
     } 
    } 
    print "$line\n"; 
} 
+0

Одна идея состоит в том, чтобы не удалить пробел. Вместо того, чтобы перебирать стоп-лист, сделайте хэш с секундомерами в виде ключей и их значениями '' ''. Затем сделайте 's # (\ w +) # $ hash {lc ($ 1)} // $ 1 # g' Обратите внимание, что вы должны использовать определенный или '//', поскольку '' '' является ложным значением. Также обратите внимание, что вы должны удалить пробел из списка. – TLP

ответ

2
my @stopList = ("the", "a", "an", "of", ..); 
my ($rx) = map qr/(?:$_)/, join "|", map qr/\b\Q$_\E\b/, @stopList; 

и позже,

$line =~ s/$rx//g; 
Смежные вопросы