Shell

如何刪除帶後綴的重複單詞?

  • June 26, 2016

如何比較可變長度的未排序單詞列表並刪除具有後綴的重複單詞?

範例單詞列表:

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

範例輸出:

   iron
   curl
   railroad
   pan
   park

這些單詞都有不同的長度,而不僅僅是四個或八個字母。我知道如何搜尋和列印包含後綴的單詞,但我不確定如何比較單詞列表,其中一些有後綴,然後刪除帶有後綴的單詞,如果有一個單詞沒有後綴列表,而不更改排序順序。

在另一個問題上為我創建的這個解決方案使用者“123”能夠可靠地去除後綴而不會破壞單詞。我想回來回答這個問題,以便任何尋求類似解決方案的人都能得到一個好的答案。

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

為此,您可能需要一個詞幹算法。例如,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;
}

範例輸出:

$ ./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 );
...

引用自:https://unix.stackexchange.com/questions/277970