Pojdi na vsebino

Damerau-Levenštejnova razdalja

Iz Wikipedije, proste enciklopedije
Damerau-Levenštejnova razdalja
Osnovni podatki
Vrsta:metrika za podobnost znakovnih nizov

Damerau-Levenštejnova razdalja je v teoriji informacij, jezikoslovju računalništvu metrika znakovnih nizov (stringov) za merjenje razlike (razdalje) med dvema zaporedjema. Neformalno je Damerau-Levenštejnova razdalja med dvema besedama najmanjše število urejanj enega znaka (vstavljanj, brisanj, zamenjevanj ali prenašanj (transpozicij), potrebnih za spremembo ene besede v drugo. Imenuje se po ameriškem računalnikarju Fredericku J. Damerauu in ruskem matematiku Vladimirju Josifoviču Levenštejnu.[1][2][3]

Damerau-Levenshteinova razdalja se od klasične Levenštejnove razdalje razlikuje po tem, da poleg treh klasičnih enoznakovnih urejevalnih operacij (vstavljanje, brisanje in zamenjevanje) med svoje dovoljene operacije vključuje prenašanja.[4][2]

V svojem temeljnem prispevku iz leta 1964 je Damerau izjavil, da je bilo v preiskavi črkovalnih napak za sistem za iskanje informacij več kot 80 % posledica ene same napake ene od štirih vrst. Dameraujev prispevek je upošteval samo črkovalne napake, ki jih je bilo mogoče popraviti z največ enim urejanjem.[5] Medtem ko je bila prvotna motivacija merjenje razdalje med človeškimi napačno črkovanimi besedami za izboljšanje aplikacij, kot je preverjanje črkovanja, se Damerau-Levenštejnova razdalja uporablja tudi v biologiji za merjenje variacije med proteinskimi zaporedji.[6]

Definicija

[uredi | uredi kodo]

Za izražanje Damerau-Levenštejnove razdalje med dvema znakovnima nizoma in je definirana funkcija , katere vrednost je razdalja med -ta simbolno predpono (začetni podniz) znakovnega niza in -to simbolno predpono znakovnega niza .

Funkcija omejene razdalje je definirana rekurzivno kot:[7]:A:11

kjer je indikatorska funkcija, enaka 0 pri in enaka 1 drugače.

Vsak rekurzivni klic se ujema z enim od primerov, ki jih pokriva Damerau-Leveštejnova razdalja:

  • ustreza brisanju (iz v ),
  • ustreza vstavljanju (iz v ),
  • ustreza ujemanju ali neujemanju, odvisno od tega, ali sta simbola enaka,
  • ustreza prenašanju med dvema zaporednima simboloma.

Damerau-Levenštejnova razdalja med znakovnima nizoma in je potem podana z vrednostjo funkcije za polna znakovna niza: , kjer označuje dolžino znakovnega niza , pa dolžino znakovnega niza .

Algoritem

[uredi | uredi kodo]

Predstavljena sta dva algoritma. Prvi,[8] enostavnejši, izračuna tisto, kar je znano kot razdalja optimalnega poravnavanja znakovnega niza (OSA) ali omejena urejevalna razdalja,[7] drugi[9] pa izračuna Damerau-Levenštejnovo razdaljo s sosednjimi prenašanji. Dodajanje prenašanj znatno zaplete algoritem. Razlika med obema algoritmoma je v tem, da algoritem optimalnega poravnavanja znakovnih nizov izračuna število operacij urejanja, ki so potrebne, da so znakovni nizi enaki pod pogojem, da se noben podniz ne ureja več kot enkrat, medtem ko drugi algoritem ne predstavlja takšne omejitve.

Naj se za primer vzame urejevalno razdaljo med in . Damerau-Leveštejnova razdalja , ker je , vendar je razdalja optimalnega poravnavanja znakovnega niza , ker če je uporabljena operacija , ni mogoče uporabiti , ker bi to zahtevalo, da se podniz ureja več kot enkrat, kar v ni dovoljeno, zato je najkrajše zaporedje operacij . Upoštevati je treba, da za razdaljo optimalnega poravnavanja znakovnega niza trikotniška neenakost ne velja:

zato to ni prava metrika.

Razdalja optimalnega poravnavanja znakovnega niza

[uredi | uredi kodo]

Razdalja optimalnega poravnavanja znakovnega niza se lahko izračuna z uporabo neposredne razširitve Wagner-Fischerjevega algoritma iz dinamičnega programiranja, ki izračuna Levenštejnovo razdaljo. V psevdokodi:

algorithm OSA-distance is
   input: strings a[1..length(a)], b[1..length(b)]
   output: distance, integer
     
   let d[0..length(a), 0..length(b)] be a 2-d array of integers, dimensions length(a)+1, length(b)+1
   // d ima indekse, ki se začnejo pri 0, pri a, b in da pa pri 1.

   for i := 0 to length(a) inclusive do
      d[i, 0] := i
   for j := 0 to length(b) inclusive do
      d[0, j] := j

   for i := 1 to length(a) inclusive do
      for j := 1 to length(b) inclusive do
         if a[i] = b[j] then
            cost := 0
         else
            cost := 1
         d[i, j] := minimum(d[i - 1, j] + 1,                                 // brisanje
                            d[i,     j - 1] + 1,                             // vstavljanje
                            d[i - 1, j - 1] + cost)                          // zamenjevanje
         if i > 1 and j > 1 and a[i] = b[j - 1] and a[i - 1] = b[j] then
                d[i, j] := minimum(d[i, j], d[i - 2, j - 2] + 1)             // prenašanje
   return d[length(a), length(b)]

Razlika od algoritma za Levenštejnovo razdaljo je dodajanje zadnje ponovitve za prenašanje.

Razdalja s sosednjimi prenašanji

[uredi | uredi kodo]

Naslednji algoritem izračuna Damerau-Levenštejnovo razdaljo s sosednjimi prenašanji. Kot dodatni parameter zahteva velikost abecede tako, da so vsi vnosi polj v :[7]:A:93

algorithm DL-distance is
   input: strings a[1..length(a)], b[1..length(b)]
   output: distance, integer

   da := new array of |Σ| integers
   for i := 1 to |Σ| inclusive do
      da[i] := 0

   let d[−1..length(a), −1..length(b)] be a 2-d array of integers, dimensions length(a)+2, length(b)+2
   // d ima indekse, ki se začnejo pri −1, pri a, b in da pa pri 1.

   maxdist := length(a) + length(b)
   d[−1, −1] := maxdist
   for i := 0 to length(a) inclusive do
      d[i, −1] := maxdist
      d[i, 0] := i
   for j := 0 to length(b) inclusive do
      d[−1, j] := maxdist
      d[0, j] := j
     
   for i := 1 to length(a) inclusive do
      db := 0
      for j := 1 to length(b) inclusive do
         k := da[b[j]]
         ℓ := db
         if a[i] = b[j] then
            cost := 0
            db := j
         else
            cost := 1
         d[i, j] := minimum(d[i − 1, j − 1] + cost,                          // zamenjevanje
                            d[i,     j − 1] + 1,                             // vstavljenje
                            d[i − 1, j  ] + 1,                               // brisanje
                            d[k − 1, ℓ − 1] + (i − k − 1) + 1 + (j - ℓ − 1)) // prenašanje
      da[a[i]] := i
   return d[length(a), length(b)]

Da se oblikuje ustrezni algoritem za izračun neomejene Damerau-Levenštejnove razdalje, je treba upoštevati, da vedno obstaja optimalno zaporedje urejevalnih operacij, kjer se enkrat prenesene črke pozneje nikoli ne spremenijo. (To velja tako dolgo dokler so stroški prenašanja vsaj povprečje stroškov vstavljanja in brisanja .[9]) Tako je treba upoštevati le dva simetrična načina spreminjanja podniza več kot enkrat: (1) prestavljanje črk in vstavljenje mednje poljubnega števila znakov ali (2) brisanje zaporedje znakov in prenašanje črk, ki po brisanju postanejo sosednje. Preprosta izvedba te zamisli daje algoritem kubične zahtevnosti: , kjer sta in dolžini znakovnih nizov. Z uporabo zamisli Lowrancea in Wagnerja[9] je mogoče ta naivni algoritem izboljšati tako, da bo v najslabšem primeru, kar počne zgornja psevdokoda.

Zanimivo je, da je algoritem bitap mogoče spremeniti za proces prenašanja. Za primer takšne prilagoditve glej razdelek za iskanje informacij.

Uporabe

[uredi | uredi kodo]

Damerau-Levenštejnova razdalja ima pomembno vlogo pri obdelavi naravnega jezika. V naravnih jezikih so znakovni nizi kratki in število napak (napačno črkovanih) redko presega 2. V takih okoliščinah se omejena in prava urejevalna razdalja zelo redko razlikujeta. Oommen in Loke[8] sta celo ublažila omejitev omejene urejevalne razdalje z uvedbo posplošenih prenašanj. Kljub temu je treba poudariti, da omejena urejevalna razdalja običajno ne zadosti trikotniški neenakosti in je zato ni mogoče uporabiti z metričnimi drevesi.

Ker je DNK pogosto podvržena vstavljanjem, brisanjem, zamenjevanjem in prenašanjem in se vsaka od teh operacij zgodi v približno enakem časovnem razponu, je Damerau-Levenštejnova razdalja ustrezna metrika variacije med dvema verigama DNK.[6] Pogostejša pri nalogah usklajevanja z DNK, beljakovinami in drugimi bioinformatiki je uporaba tesno povezanih algoritmov, kot sta algoritem Needleman-Wunschev algoritem ali Smith-Watermanov algoritem.

Odkrivanje goljufij

[uredi | uredi kodo]

Algoritem je mogoče uporabiti s poljubno množico besed, kot so imena prodajalcev. Ker je vnos po naravi ročni, obstaja nevarnost vnosa lažnega prodajalca. Zaposleni, ki je goljuf, lahko vnese enega pravega prodajalca, kot je »Rich Heir Estate Services«, v primerjavi z lažnim prodajalcem »Rich Hier State Services«. Goljuf bi nato ustvaril lažni bančni račun in zahteval, da bi podjetje čeke usmerilo k pravemu prodajalcu in lažnemu prodajalcu. Damerau-Levenštejnov algoritem bo zaznal prestavljeno in izpuščeno črko ter na elemente opozoril preiskovalcu goljufij.

Nadzor izvoza

[uredi | uredi kodo]

Vlada ZDA uporablja Damerau-Levenštejnovo razdaljo s svojim API-jem Consolidated Screening List.[10]

Glej tudi

[uredi | uredi kodo]

Sklici

[uredi | uredi kodo]
  1. ↑ Brill; Moore (2000).
  2. 1 2 Bard (2007).
  3. ↑ Li; Zhang; Zhu; Zhou (2006).
  4. ↑ Levenštejn (1965).
  5. ↑ Damerau (1964).
  6. 1 2 Majorek; idr (2013).
  7. 1 2 3 Boytsov (2011).
  8. 1 2 Oommen; Loke (1997).
  9. 1 2 3 Lowrance; Wagner (1975).
  10. ↑ »Consolidated Screening List API«, Trade.gov Developer Portal (v angleščini), International Trade Administration, U.S. Department of Commerce, arhivirano iz prvotnega spletišča dne 30. oktobra 2019