如何删除带有后缀的重复单词?

J36*_*363 4 shell grep sed awk text-processing

如何比较可变长度的未排序单词列表并删除具有后缀的重复单词?

示例单词列表:

    iron        
    curl
    curled
    railroad
    curler
    curling
    curls
    irons
    pan
    pans
    park
    parker
    parks
    parked
    railroads
Run Code Online (Sandbox Code Playgroud)

示例输出:

    iron
    curl
    railroad
    pan
    park
Run Code Online (Sandbox Code Playgroud)

这些单词都有不同的长度,而不仅仅是四个或八个字母。我知道如何搜索和打印包含后缀的单词,但我不知道如何比较单词列表,其中一些有后缀,然后删除带后缀的单词,如果有一个单词没有后缀列表,而不改变排序顺序。

Gui*_*ido 7

为此,您可能需要一个词干提取算法。例如,Lingua::Stem是一个用 Perl 编写的词干分析器模块。

如果这符合您的需求,您将需要通过 CPAN安装Lingua::Stem。然后,以下 Perl 脚本将完成这项工作:

#!/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;
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

$ ./stem.pl < inputfile
curl
curler
iron
pan
park
parker
railroad
Run Code Online (Sandbox Code Playgroud)

显然,由于词干分析器对单词后缀的解释在某些情况下与您的不同,这与您的示例输出略有不同。如果这仅影响应用程序中的中等数量的单词,则可以使用以下add_exceptions方法定义异常:

...
$s->add_exceptions( { "parker" => "park", "curler" => "curl" } );
$stemmed = $s->stem_in_place( @words );
...
Run Code Online (Sandbox Code Playgroud)