サフィックス付きの重複語を削除する方法は?

サフィックス付きの重複語を削除する方法は?

可変長のソートされていない単語のリストを比較し、接尾辞付きの重複単語を削除するにはどうすればよいですか?

単語リストの例:

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

出力例:

    iron
    curl
    railroad
    pan
    park

単語の長さはすべて4〜8文字ではなく、すべて異なります。サフィックスを含む単語を検索して印刷する方法を知っていますが、一部の単語にサフィックスを含む単語のリストを比較してから、サフィックスを含む単語を削除する方法がわかりません(接尾辞のない単語がある場合)。ソート順を変更せずにリストから

ベストアンサー1

これには形態素解析アルゴリズムが必要になる場合があります。例えば、言語::茎Perlで書かれた形態素分析モジュール。

これがあなたのニーズに合っている場合は、インストールする必要がありますLingua::CPANによる茎。その後、次の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;
}

出力例:

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

明らかに、これは、単語サフィックスのための形態素分析器の解釈が場合によってはあなたの解釈とは異なるため、出力例とはわずかに異なります。これがアプリケーションの適切な数の単語にのみ影響する場合は、add_exceptions次のように例外を定義できます。

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

おすすめ記事