파일의 각 줄 쌍 사이의 유사성을 비교하거나 거리를 편집하시겠습니까?

파일의 각 줄 쌍 사이의 유사성을 비교하거나 거리를 편집하시겠습니까?

다음과 같은 방법을 사용하여 파일에 포함된 가장 유사한 줄 쌍을 찾고 싶습니다.거리 편집. 예를 들어 다음 내용이 포함된 파일이 있다고 가정합니다.

What is your favorite color?
What is your favorite food?
Who was the 8th president?
Who was the 9th president?

...가장 유사한 쌍으로 행 3과 4를 반환합니다.

이상적으로는 가장 유사한 상위 X개 행을 계산할 수 있기를 바랍니다. 따라서 위의 예를 사용하면 두 번째로 가장 유사한 쌍은 행 1과 행 2가 됩니다.

답변1

나는 Levenshtein 거리에 익숙하지 않지만 Perl은편집 거리 계산 모듈따라서 입력에서 각 선 조합 쌍의 거리를 계산한 다음 "상위 X"(N) 매개변수의 영향을 받아 "거리"를 늘려 인쇄하는 간단한 Perl 스크립트를 작성했습니다.

#!/usr/bin/perl -w
use strict;
use Text::Levenshtein qw(distance);
use Getopt::Std;

our $opt_n;
getopts('n:');
$opt_n ||= -1; # print all the matches if -n is not provided

my @lines=<>;
my %distances = ();

# for each combination of two lines, compute distance
foreach(my $i=0; $i <= $#lines - 1; $i++) {
  foreach(my $j=$i + 1; $j <= $#lines; $j++) {
        my $d = distance($lines[$i], $lines[$j]);
        push @{ $distances{$d} }, $lines[$i] . $lines[$j];
  }
}

# print in order of increasing distance
foreach my $d (sort { $a <=> $b } keys %distances) {
  print "At distance $d:\n" . join("\n", @{ $distances{$d} }) . "\n";
  last unless --$opt_n;
}

샘플 입력에서는 다음을 제공합니다.

$ ./solve.pl < input
At distance 1:
Who was the 8th president?
Who was the 9th president?

At distance 3:
What is your favorite color?
What is your favorite food?

At distance 21:
What is your favorite color?
Who was the 8th president?
What is your favorite color?
Who was the 9th president?
What is your favorite food?
Who was the 8th president?
What is your favorite food?
Who was the 9th president?

그리고 선택적 매개변수를 표시합니다.

$ ./solve.pl -n 2 < input
At distance 1:
Who was the 8th president?
Who was the 9th president?

At distance 3:
What is your favorite color?
What is your favorite food?

출력을 명시적으로 인쇄하는 방법을 잘 모르겠지만 원하는 대로 문자열을 인쇄할 수 있습니다.

관련 정보