Edytuj odległość — Edit distance

W lingwistyki komputerowej i informatyki , edycja odległość jest sposobem ilościowym, jak odmienne dwa ciągi znaków (np słowa) są ze sobą licząc minimalną liczbę operacji potrzebnych do przekształcenia jeden ciąg na drugą. Edytowanie odległości znajduje zastosowanie w przetwarzaniu języka naturalnego , gdzie automatyczna korekta pisowni może określić potencjalne poprawki dla błędnie napisanego słowa, wybierając słowa ze słownika, które mają małą odległość od danego słowa. W bioinformatyce można go wykorzystać do ilościowego określenia podobieństwa sekwencji DNA , które można postrzegać jako ciągi liter A, C, G i T.

Różne definicje odległości edycji wykorzystują różne zestawy operacji na ciągach. Operacje Levenshteina na odległość to usuwanie, wstawianie lub zastępowanie znaku w ciągu. Jako najpopularniejsza metryka, termin odległość Levenshteina jest często używany zamiennie z określeniem odległości edycji .

Rodzaje odległości edycji

Różne typy odległości edycji umożliwiają różne zestawy operacji na ciągach. Na przykład:

Niektóre odległości edycji są zdefiniowane jako parametryzowalne metryki obliczane za pomocą określonego zestawu dozwolonych operacji edycji, a każdej operacji przypisywany jest koszt (prawdopodobnie nieskończony). Jest to dalej uogólniane przez algorytmy dopasowywania sekwencji DNA , takie jak algorytm Smitha-Watermana , które sprawiają, że koszt operacji zależy od miejsca jej zastosowania.

Formalna definicja i właściwości

Biorąc pod uwagę dwa łańcuchy a i b w alfabecie Σ (np. zbiór znaków ASCII , zbiór bajtów [0..255] itd.), odległość edycji d( a , b ) jest serią edycji o minimalnej wadze operacje, które przekształcają a w b . Jednym z najprostszych zestawów operacji edycyjnych jest ten zdefiniowany przez Levenshteina w 1966 roku:

Wstawienie pojedynczego symbolu. Jeśli a = u v , to wstawienie symbolu x daje u x v . Można to również oznaczyć jako ε→ x , używając ε do oznaczenia pustego łańcucha.
Usunięcie pojedynczego symbolu zmienia u x v na u v ( x →ε).
Zastąpienie pojedynczego symbolu x symbolem yx zmienia u x v na u y v ( xy ).

W pierwotnej definicji Levenshteina każda z tych operacji ma koszt jednostkowy (z wyjątkiem tego, że samo podstawienie znaku ma zerowy koszt), więc odległość Levenshteina jest równa minimalnej liczbie operacji wymaganych do przekształcenia a do b . Bardziej ogólnie współpracownicy rozdzielczości niż negatywne funkcje wagowe W ins ( X ), w del ( X ) i w ramach ( xy ) o operacji.

Zasugerowano dodatkowe prymitywne operacje. Odległość Damerau–Levenshteina liczy się jako pojedyncza edycja częstym błędem: transpozycja dwóch sąsiednich znaków, formalnie charakteryzująca się operacją zmieniającą u x y v na u y x v . W celu poprawienia wyników OCR wykorzystano operacje łączenia i dzielenia, które zamieniają pojedynczy znak na parę lub odwrotnie.

Inne warianty odległości edycji uzyskuje się poprzez ograniczenie zestawu operacji. Najdłuższa wspólna odległość podciągu (LCS) to odległość edycji z wstawianiem i usuwaniem jako jedynymi dwiema operacjami edycji, obie po koszcie jednostkowym. Podobnie, dopuszczając tylko zamiany (ponownie po koszcie jednostkowym), uzyskuje się odległość Hamminga ; musi to być ograniczone do ciągów o równej długości. Odległość Jaro–Winklera można uzyskać z odległości edycyjnej, w której dozwolone są tylko transpozycje.

Przykład

Odległość Levenshteina między „kotek” i „siedzenie” to 3. Minimalny edytować skrypt, który przekształca byłe do tej drugiej jest:

  1. k itten → s itten (zamień "s" na "k")
  2. sitt e n → sitt i n ( zamień "i" na "e")
  3. sittin → sittin g (wkładka "g" na końcu)

Odległość LCS (tylko wstawienia i usunięcia) daje inną odległość i minimalny skrypt edycji:

  1. k itten → itten (usuń „k” w 0)
  2. itten → s itten (wstaw "s" na 0)
  3. sitt e n → sittn (usuń "e" w 4)
  4. sittn → sitt ja n (wstaw "i" w 4)
  5. sittin → sittin g (wkładka "g" na 6)

za łączny koszt/odległość 5 operacji.

Nieruchomości

Edycja odległości z nieujemnym kosztem spełnia aksjomaty metryki , dając początek przestrzeni metrycznej ciągów, gdy spełnione są następujące warunki:

  • Każda operacja edycji ma dodatni koszt;
  • dla każdej operacji istnieje operacja odwrotna o równych kosztach.

Dzięki tym właściwościom aksjomaty metryczne są spełnione w następujący sposób:

d ( a , b ) = 0 wtedy i tylko wtedy, gdy a=b, ponieważ każdy łańcuch może zostać w prosty sposób przekształcony w siebie za pomocą operacji dokładnie zerowych.
d ( a , b ) > 0 gdy ab , ponieważ wymagałoby to co najmniej jednej operacji o niezerowym koszcie.
d ( a , b ) = d ( b , a ) przez równość kosztu każdej operacji i jej odwrotność.
Nierówność trójkąta: d ( a , c ) ≤ d ( a , b ) + d ( b , c ).

Odległość Levenshteina i odległość LCS z kosztem jednostkowym spełniają powyższe warunki, a zatem aksjomaty metryczne. W literaturze rozważano również warianty odległości edycji, które nie są właściwymi metrykami.

Inne przydatne właściwości odległości edycji kosztu jednostkowego obejmują:

  • Odległość LCS jest ograniczona powyżej sumą długości pary ciągów.
  • Odległość LCS to górna granica odległości Levenshteina.
  • W przypadku strun o tej samej długości odległość Hamminga jest górną granicą odległości Levenshteina.

Niezależnie od kosztu/wagi, następujące właściwości wszystkich odległości edycji:

  • Gdy a i b mają wspólny przedrostek, ten przedrostek nie ma wpływu na odległość. Formalnie, gdy a = uv i b = uw , to d ( a , b ) = d ( v , w ). Pozwala to przyspieszyć wiele obliczeń obejmujących edycję odległości i edycję skryptów, ponieważ popularne przedrostki i przyrostki można pomijać w czasie liniowym.

Obliczenie

Pierwszy algorytm obliczania minimalnej odległości edycji między parą ciągów został opublikowany przez Damerau w 1964 roku.

Wspólny algorytm

Używając oryginalnych operacji Levenshteina, (niesymetryczna) odległość edycji od do jest określona przez , zdefiniowana przez powtarzanie

Algorytm ten można uogólnić do obsługi transpozycji, dodając kolejny termin w minimalizacji klauzuli rekurencyjnej.

Prosty, rekurencyjny sposób oceny tej powtarzalności wymaga czasu wykładniczego . Dlatego jest zwykle obliczany przy użyciu dynamicznego algorytmu programowania , który jest powszechnie przypisywany Wagnerowi i Fischerowi , chociaż ma historię wielu wynalazków. Po zakończeniu algorytmu Wagnera-Fischera minimalną sekwencję operacji edycyjnych można odczytać jako ślad operacji stosowanych podczas algorytmu programowania dynamicznego, począwszy od .

Algorytm ten ma złożoność czasową Θ( m n ), gdzie m i n są długościami ciągów. Gdy konstruowana jest pełna tablica programowania dynamicznego, jej złożoność przestrzenna również wynosi Θ( m n ) ; można to poprawić do Θ(min( m , n )) przez obserwację, że w dowolnym momencie algorytm wymaga tylko dwóch wierszy (lub dwóch kolumn) w pamięci. Jednak ta optymalizacja uniemożliwia odczytanie minimalnej serii operacji edycyjnych. Rozwiązanie tego problemu w przestrzeni liniowej oferuje algorytm Hirschberga .

Ulepszone algorytmy

Udoskonalając opisany powyżej algorytm Wagnera-Fishera, Ukkonen opisuje kilka wariantów, z których jeden przyjmuje dwa ciągi znaków i maksymalną odległość edycji s i zwraca min( s , d ) . Osiąga to tylko poprzez obliczanie i przechowywanie części tabeli programowania dynamicznego wokół jej przekątnej. Ten algorytm zajmuje czas O( s ×min( m , n )) , gdzie m i n są długościami ciągów. Złożoność przestrzeni to O( s 2 ) lub O( s ) , w zależności od tego, czy sekwencja edycyjna musi zostać odczytana.

Dalsze ulepszenia Landaua , Myersa i Schmidta [1] dają algorytm czasu O( s 2 + max( m , n )) .

Aplikacje

Dystans edycji znajduje zastosowanie w biologii obliczeniowej i przetwarzaniu języka naturalnego, np. korekta błędów ortograficznych lub błędów OCR oraz przybliżone dopasowanie ciągów , gdzie celem jest znalezienie dopasowań dla krótkich ciągów w wielu dłuższych tekstach, w sytuacjach, gdy niewielka liczba różnic należy się spodziewać.

Istnieją różne algorytmy, które rozwiązują problemy poza obliczaniem odległości między parą ciągów, aby rozwiązywać powiązane typy problemów.

  • Algorytm Hirschberga oblicza optymalne wyrównanie dwóch ciągów, gdzie optymalność jest definiowana jako minimalizacja odległości edycji.
  • Przybliżone dopasowanie ciągów można sformułować na podstawie odległości edycji. Algorytm Ukkonena z 1985 roku bierze łańcuch p , zwany wzorcem, oraz stałą k ; następnie buduje deterministyczny automat skończony, który znajduje w dowolnym ciągu s , podłańcuch, którego odległość edycji od p wynosi co najwyżej k (por. algorytm Aho-Corasick , który podobnie konstruuje automat do wyszukiwania dowolnego z wielu wzorce, ale bez zezwalania na operacje edycji). Podobnym algorytmem przybliżonego dopasowywania ciągów jest algorytm bitap , również definiowany w kategoriach odległości edycji.
  • Automaty Levenshteina to automaty skończone, które rozpoznają zbiór ciągów znaków w ograniczonej odległości edycji od ciągu ustalonego odniesienia.

Odległość edycji języka

Uogólnienie odległości edycji między ciągami znaków to odległość między tekstem a językiem, zwykle językiem formalnym . Zamiast uwzględniać odległość edycji między jednym ciągiem a drugim, odległość edycji języka jest minimalną odległością edycji, którą można osiągnąć między ustalonym ciągiem a dowolnym ciągiem pobranym z zestawu ciągów. Bardziej formalnie, dla dowolnego języka L i łańcucha x nad alfabetem Σ , odległość edycji języka d( L , x ) jest wyrażona wzorem , gdzie jest odległością edycji łańcucha. Gdy język L jest bezkontekstowy , istnieje algorytm dynamicznego programowania czasu sześciennego zaproponowany przez Aho i Petersona w 1972 r., który oblicza odległość edycji języka. W przypadku mniej wyrazistych rodzin gramatyk, takich jak gramatyki regularne , istnieją szybsze algorytmy obliczania odległości edycji.

Odległość edycji języka znalazła wiele różnych zastosowań, takich jak składanie RNA, korekcja błędów i rozwiązania problemu Optimum Stack Generation.

Zobacz też

Bibliografia