algorytm.org Algorithms Przetwarzanie tekstu Odległość Levenshteina (odległość edycyjna)  
Home AlgorithmsData structuresAlgorithmics turorialPractiseDesign patternsIT Law SitemapPortal historyContributors ForumToolsWrite an articleSearch 

Odległość Levenshteina (odległość edycyjna)
User Rating: / 7
PoorBest 
Written by Paweł Łuczak   
Friday, 06 February 2009 18:51
There are no translations available.

Algorytm Levenshteina, służy do liczenia odległości edycyjnej (odległości Levenshteina). Jest to najmniejsza liczba działań prostych, przeprowadzająca jeden napis w drugi.
    Działania proste to:
  • wstawienie nowego znaku
  • usuniecie znaku
  • zamiana na inny znak

Idea algorytmu to stworzenie tablicy dwuwymiarowej, o wymiarach n+1 na m+1 gdzie n i m to odpowiednio długości porównywanych słów.
Pierwszy wiersz i kolumnę uzupełniamy wartościami od 0 do, odpowiednio n i m.
Następnie bierzemy po kolei wartości wiersza i porównujemy literkę dotyczącą tego wiersza z literą dotyczącą kolumny. Dokonujemy porównania liter na zasadzie każdy z każdym. Przy każdym porównaniu wykonujemy poniższą procedurę. Jeśli literki są identyczne, ustawiamy koszt na 0, jeśli nie, na 1. Teraz musimy daną komórkę wypełnić wartością, którą będzie minimum z:
  • wartości komórki leżącej bezpośrednio nad naszą aktualną komórka zwiększonej o 1,
  • wartości komórki leżącej bezpośrednio w lewo od naszej aktualnej komórki + 1
  • wartości komórki leżącej bezpośrednio w lewą-górna stronę od aktualnej komórki + koszt

Po wykonaniu wszystkich porównań, naszą odległością edycyjną będzie wartość w komórce [n+1, m+1].

Przykład:
Obliczymy odległość Levenshteina dla wyrazów: "foka" i "kotka".
Na początek zainicjujemy pierwszy wiersz i kolumnę w naszej tablicy wielkości 4+1 na 5+1.

012345
1     
2     
3     
4     

Teraz policzmy wartości dla drugiej kolumny, czyli pierwszej litery wyrazu kotka i kolejnych liter wyrazu foka.
k jest różne od f, zatem nasz koszt wynosi 1, bierzemy zatem minimum z liczb: 1+1 (komórka nad powiększona o 1), 1+1 (komórka z lewej powiększona o 1) oraz 0+1 (komórka po ukosie lewa-górna + koszt). Zatem wpisujemy 1.

012345
11    
2     
3     
4     

Kolejna para to k i o, zatem koszt wynosi 1. Bierzemy więc minimum z liczb: 1+1 (komórka nad powiększona o 1), 2+1 (komórka z lewej powiększona o 1) oraz 1+1 (komórka po ukosie lewa-górna + koszt). Zatem wpisujemy 2.

012345
11    
22    
3     
4     

Następna para to k i k, zatem koszt wynosi 0. Bierzemy więc minimum z liczb: 2+1 (komórka nad powiększona o 1), 3+1 (komórka z lewej powiększona o 1) oraz 2+0 (komórka po ukosie lewa-górna + koszt). Zatem wpisujemy 2.

012345
11    
22    
32    
4     

Ostatnia para w tej kolumnie to k i a, zatem koszt wynosi 1. Bierzemy więc minimum z liczb: 2+1 (komórka nad powiększona o 1), 4+1 (komórka z lewej powiększona o 1) oraz 3+1 (komórka po ukosie lewa-górna + koszt). Zatem wpisujemy 3.

012345
11    
22    
32    
43    

Teraz policzmy wartości dla drugiej kolumny, czyli drugiej litery wyrazu kotka i kolejnych liter wyrazu foka.

012345
112   
221   
322   
433   

Postępując analogicznie dla kolejnych wierszy uzupełnimy tabelę następująco.

012345
112345
221234
322223
433332

W dolnym prawym narożniku znajduje się wynik 2 czyli odległość edycyjna wyrazów "foka" i "kotka". Zatem od jednego do drugiego wyrazu możemy przejść w dwóch prostych działaniach:
foka -> kotka: 1) zamieniając f na k, 2) dodając literę t,
kotka -> foka: 1) zamieniając k na f, 2) usuwając literę t.

Algorytm ten stosuje się m.in w analizie DNA, rozpoznawaniu plagiatów, korekcie pisowni - wyszukiwanie podpowiedzi prawidłowego wyrazu.


.

Author Progam language Comment Download Rate
Tomasz Lubiński C#
Implementation in C#
/ 0
Rafał Świetlicki C/C++
Implementation in C/C++
/ 0
Tomasz Lubiński Delphi/Pascal
Implementation in Delphi/Pascal
/ 0
Tomasz Lubiński Java
Implementation in Java
/ 0
Paweł Łuczak Ruby
Implementation in Ruby
/ 0
 
Add your implementation for this algorithm
  • Login first
File:
Progam language:
Comment:
  To be able to add your implementation, login first



Last Updated on Monday, 07 June 2010 23:18
 

Add comment







Danation
Donate us


RSS Channels
Articles
Implementations
Comments
Forum


Bookmarks








Poll
Czy znalazłeś na stronach www.algorytm.org to czego szukałeś?
 

www.algorytm.org (c) 2000-2010