Como faço para remover palavras duplicadas com sufixos?

4

Como faço para comparar uma lista de palavras não ordenadas de tamanho variável e remover palavras duplicadas que tenham um sufixo?

Exemplo de lista de palavras:

    iron        
    curl
    curled
    railroad
    curler
    curling
    curls
    irons
    pan
    pans
    park
    parker
    parks
    parked
    railroads

Exemplo de saída:

    iron
    curl
    railroad
    pan
    park

As palavras têm comprimentos diferentes, não apenas quatro ou oito letras. Eu sei como pesquisar e imprimir palavras contendo sufixos, mas não sei como comparar uma lista de palavras, algumas das quais têm sufixos e, em seguida, remover as palavras com sufixos, se houver uma palavra que não tenha um sufixo a lista, sem alterar a ordem de classificação.

    
por J363 21.04.2016 / 04:17

2 respostas

0

Esse usuário de solução "123" criado para mim em outra pergunta conseguiu remover os sufixos de maneira confiável sem alterar as palavras. Eu queria voltar e responder a essa pergunta para que qualquer pessoa que buscasse uma solução semelhante pudesse obter uma boa resposta.

awk 'FNR==NR{a[$0 "s"]++;next}!($0 in a)' file.txt file.txt
awk 'FNR==NR{a[$0 "ed"]++;next}!($0 in a)' file.txt file.txt
awk 'FNR==NR{a[$0 "ing"]++;next}!($0 in a)' file.txt file.txt
awk 'FNR==NR{a[$0 "ness"]++;next}!($0 in a)' file.txt file.txt
awk 'FNR==NR{a[$0 "er"]++;next}!($0 in a)' file.txt file.txt
    
por 26.06.2016 / 14:36
7

Você pode precisar de um algoritmo de stemming de palavras para isso. Por exemplo, Lingua :: Stem é um módulo de word stemmer escrito em Perl.

Se isso atender às suas necessidades, você precisará instalar o Lingua :: Haste via CPAN . Então, o seguinte script Perl faria o trabalho:

#!/usr/bin/perl

require Lingua::Stem;

# Read lines into array
chomp(my @words = <STDIN>);

# Stem in English
my $s = Lingua::Stem->new( -locale => 'en' );
my $stemmed = $s->stem_in_place( @words );

# Output result of stemmed words with duplicates removed
my $oldw = undef;
foreach $w (sort @$stemmed) {
    print "$w\n" unless ($w eq $oldw);
    $oldw = $w;
}

Exemplo de saída:

$ ./stem.pl < inputfile
curl
curler
iron
pan
park
parker
railroad

Obviamente, isso se desvia um pouco do resultado do seu exemplo devido à interpretação do lematizador de sufixos de palavras que difere do seu em alguns casos. Se isso afetar apenas um número moderado de palavras em seu aplicativo, é possível definir exceções com o método add_exceptions :

...
$s->add_exceptions( { "parker" => "park", "curler" => "curl" } );
$stemmed = $s->stem_in_place( @words );
...
    
por 21.04.2016 / 07:05