가변 길이의 정렬되지 않은 단어 목록을 비교하고 접미사가 있는 중복 단어를 제거하는 방법은 무엇입니까?
단어 목록 예:
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 );
...
답변2
다른 질문에 대해 사용자 "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