Virheiden tunnistusta

[viesti Survo-keskustelupalstalla (2001-2013)]

Kirjoittaja: Seppo Mustonen
Sähköposti:    -
Päiväys: 1.6.2004 9:56

Petri Palmu lähetti minulle viime viikolla viestin, jossa hän ihmetteli,
miksi seuraava tekstitiedoston siirto Survo-tiedostoksi ei toimi.
Hänen luvallansa kerron aluksi, mistä tarkalleen oli kyse.

........................................................
testi1.txt on tallennettu sarkainerotettuna

TXTCONV testi1.txt,testi2.txt
CONVERSIONS:
R , .
END
SHOW testi2.txt

FILE DEL KOE1
FILE SAVE testi2.txt,KOE1 / NAMES=1 / DELIMETER=TAB / FIRST=2
FILE SHOW KOE1
........................................................

Viestin liitteenä Petrillä oli alkuperäinen tekstitiedosto testi1.txt
rakenteeltaan
VARX VARY IND
3449685,701 7674377,508 1
3449329,653 7676480 2
3448356,047 7679630,545 3
...

ja hän ilmoitti:
> Kun yritän lukea oheisen tyyppisen tekstitiedoston (sarkainerotettuna)
> .SVO -dataksi, niin näyttää siltä, että kaikki muuttujat menevät
> pötkönä vain ensimmäiselle sarakkeelle.

Kopioin po. tiedot omaan Survooni ja toistin kokeen havaitakseni, että
Petrin väite pitää paikkansa.

Käytin aikaa puolisen tuntia (muunnellen tehtävää eri tavoin)
huomatakseni lopulta, mistä kaikki kiikastaa.

Pyydän, että yrität löytää virheen ennenkuin jatkan tätä tarinaa.

Seuraa 25 tyhmää riviä (jotta et niin helpolla "lunttaisi"):
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Virhe on rivillä
FILE SAVE testi2.txt,KOE1 / NAMES=1 / DELIMETER=TAB / FIRST=2
jolla täsmennys DELIMITER=TAB on kirjoitettu väärin.

Tällaista voi sattua kelle tahansa Survon käyttäjälle varsinkin kun
monet avainsanat ovat keinotekoisia.
Tuollaiset ongelmat liittyvät kaikkiin järjestelmiin, joissa
kirjoitetaan ohjelmalle tarkoitettuja komentoja eikä millään
tuntemallani systeemillä ole huumorintajua edes sen vertaa, että
se suvaitsisi pienet huolimattomuudet.

Muistan, että tästä on käyty Survon piirissä keskustelua aikaisemminkin,
mutta (lieväksi) häpeäkseni tunnustan, etten ole tehnyt asialle mitään.
Petrin ongelma havahdutti uudelleen miettimään ja päätin yrittää...

Olen nyt alustavasti toteuttanut sen, että jos käyttäjä kirjoittaa
jonkin Survon komentosanan väärin, Survo saattaa entisen tylyn
ilmoituksen "Operation not available!" lisäksi antaa vinkkejä
mahdollisista "oikeista" komentosanoista.

Esim. jos aktivoin komennon

PGLOT KUNNAT,Tulotaso,SYNT

rivin alapuolelle ilmestyy väliaikaisena näyttönä

Virheellinen komentosana!
Vaihtoehtoja: PLOT GPLOT

Tästä käyttäjä ottaa onkeensa mitä haluaa; sellaisten teksturien
arveluttavalle tielle ei kuitenkaan olla astumassa, että Survo
"automaattisesti korjaisi virheen".

Toteutus kattaa nyt vain komentosanat, mutta pyrin (ankaran harkinnan
jälkeen) ulottamaan sen myös täsmennyssanoihin, jotta esim.
DELIMETER=TAB -tyyppiset tapaukset huomattaisiin. Se on kuitenkin
hiukan laajakantoisempi urakka kuin komentosanojen tarkkailu enkä
tapani mukaan varmasti lupaa mitään :)

Heille, joita kiinnostaa mitä konehuoneen puolella tapahtuu,
kerrottakoon hieman nykytilanteesta.

Komentosanan hierarkinen tulkinta
---------------------------------

Kun Survon toimituskentässä käyttäjä aktivoi jonkin kohdan (joko
hiiren kaksoisnäpäytyksellä tai ESC-napilla), Survon toimitin (editori)
kiinnostuu aktivoinnin kohteesta ja yrittää tulkita sen jonain
seuraavista (tässä järjestyksessä):

1. komento, esim. [CORR DECA,CUR+1],
2. aritmeettinen lauseke, esim. [sqrt(a+3)=],
3. keskellä riviä sijaitseva verkko-osoite tai linkki jonkun muun
             ohjelman tiedostoon, esim. [Survo-sivut: www.survo.fi],
4. "ranskalaisella viivalla" merkitty viittaus samaan kenttään
             esim. [ - Esimerkki 1.].

Jokaisella vaihtoehdolla on omat seuraamuksensa:

1. komento tai operaatio toteutetaan,
2. lausekkeen arvo lasketaan ja tulos kirjoitetaan,
3. käynnistetään selainohjelma ja näytetään ko. sivu tai
   avataan osoitettu tiedosto toisella ohjelmalla,
4. siirrytään kentässä viitattuun kohtaan.

Jos mikään näistä ei onnistu, Survo on tähän asti ilmoittanut pelkästään
"Operation not available!"
Nyt kuitenkin ennen tätä ilmoitusta ryhdytään vielä tutkimaan aktivoidun
rivin ensimmäistä "sanaa" ja yritetään selvittää, mitä kelvollisia
komentosanoja se lähinnä muistuttaa.

Oikeista komentosanoista olen laatinut luettelon, joka on tallennettu
tekstitiedostoksi <Survo>\U\SYS\COMMANDS.SYS
ja sen sisältö on muotoa
LOADP <Survo>\U\SYS\COMMANDS.SYS
FILE
PLOT
GPLOT
HISTO
GHISTO
PRINT
jne. (yhteensä 178 kpl. sanoja tällä hetkellä)

Tätä luetteloa tullaan päivittämään uusien komentojen ilmaantuessa.

Kun kohdataan tuntematon komentosana (esim. LOADK), sitä verrataan
jokaiseen luettelossa esiintyvään sanaan ja lasketaan tietyllä
algoritmilla kokonaislukuarvoinen "etäisyys", joka ilmaisee kuinka
paljon sanat (esim. LOADK ja LOADP) eroavat toisistaan.
Määrätään etäisyyden minimiarvo ja pannaan talteen ne komentosanat,
joilla on tuo pienin etäisyys virheelliseen komentosanaan.
Mikäli minimietäisyys ei ole liian suuri eikä sitä vastaavia oikeita
sanoja ole liikaa, ne kerrotaan käyttäjälle seuraavasti:

Esim.
LOADK KOE.TXT
aktivoituna saa aikaan ilmoituksen

Virheellinen komentosana!
Vaihtoehtoja: LOAD LOADM LOADP LOADW

Vastaavasti joillekin tuskallinen SCRATCH-komento väärinkirjoitettuna
tuottaa mm. seuraavia vaihtoehtoja:
SCRAT  antaa  STAT SORT SCRATCH,
SCRATS antaa  SCRATCH,
SKRATC antaa  SCRATCH.

Levenshteinin etäisyysmitta
---------------------------

Sanojen tai yleisemmin merkkijonojen välisten erojen (etäisyyksien)
mittaaminen ei ole aivan itsestään selvä juttu.
Olin varma, ettei tarvitse keksiä pyörää uudelleen ja lähdin
etsimään tietoja verkosta Googlella haulla "word +distance".
Sijalta 25 löytyi ensimmäinen sopiva lähde nimellä "Distance
between strings"
www.cut-the-knot.org/do_you_know/Strings.shtml 
ja sieltä edelleen "Levenshtein distance".
Vladimir Levenshtein on venäläinen matemaatikko, joka vuonna 1965
julkaisi mittansa koodausteoriaa koskevassa artikkelissa.
Mitta näyttää olevan käytössä hyvin monenlaisissa sovelluksissa
(oikoluvun ohella mm. genetiikassa ja tiedostojen vertailussa).
Lisätietoja saa mm. sivuilta
www.merriampark.com/ld.htm 
www.csse.monash.edu.au/~lloyd/tildeAlgDS/Dynamic/Edit/ 

Mitasta käytetään myös nimitystä "edit distance" koska se kertoo,
kuinka monta merkin poistoa, lisäystä ja vaihtoa tarvitaan vähintään,
jotta merkkijono saadaan editoituksi toiseksi merkkijonoksi.

Esimerkkejä editointiaskeleista:
Poisto: SURVO -> SURO
Lisäys: SURO -> SUKRO
Vaihto: SUKRO -> MUKRO (MUKRO on leikkisä nimitys näppäinsukroille.)

Näin siis 3 askeleella saadaan muunnos SURVO -> MUKRO. Sitä ei voi tehdä
vähemmällä vaivalla eli Levenshteinin etäisyys on d(SURVO,MUKRO)=3.

Selkeyttääkseni käsitystäni tein aluksi Survoon oman komennon STRDIST,
joka ilmoittaa kahden toimituskentän rivin sisältämien merkkijonojen
etäisyyden. Siis, jos aktivoidaan

STRDIST CUR+1,CUR+2
ALUT
LATU

komennon perään ilmaantuu vastaus

STRDIST CUR+1,CUR+2 / Levenshtein distance is 3.
ALUT
LATU

"Harjoitustehtävä": Selvitä, miten kolmella askeleella ALUT -> LATU.

                        * * *

Ollin (Väinö Nuorteva) pakinassa näytelmäkirjailija Kalle Laatikon
Afrikasta teatterilleen lähettämä sähke "Njtelmni essitistismillinen"
johti suureen kiinnostukseen uutta "essitistismillistä" taidesuuntausta
kohtaan. Allaolevasta selviää, mikä oli sähkeen alkuperäinen
kirjoitusasu ja kuinka kaukana se oli lopullisesta:

STRDIST CUR+1,CUR+2 / Levenshtein distance is 12.
Näytelmäni ensiesitys milloin on
Njtelmni essitistismillinen

                        * * *

Levenshteinin mitasta on olemassa erilaisia yleistyksiä mm. siten, että
eri editointitoimenpiteille annetaan erilaiset painoarvot ja esim.
kirjainten läheisyys näppäimistöllä vaikuttaa tulokseen.
Näille yleistyksille en kuitenkaan katso olevan tarvetta.

Kokeillessani mittaa Survon komento- ja täsmennyssanoilla olen
havainnut, että sitä ainakin tässä yhteydessä voisi parantaa
sallimalla lisäeditointimuotona peräkkäisten kirjaimien paikan-
vaihdon, josta en ole todennut mainintoja.

Esim. kuvanpiirtokomento GPLOT voi kahdella sormella kirjoitettuna
helposti lipsahtaa muotoon PGLOT. Tällöin d(PGLOT,GPLOT)=2 mutta myös
vaikkapa d(SULOT,GPLOT)=2 eikä omaan järkeeni käy oikein että SULOT ja
PGLOT olisivat yhtä lähellä sanaa GPLOT. Jos paikanvaihto sallitaan, on
d(PGLOT,GPLOT)=1, mutta SULOT ovat edelleen etäisyydellä 2.

Niinpä olen (ainakin toistaiseksi) päätynyt poikkeamaan tällä tavalla
alkuperäisestä mitasta siinä tapauksessa, että sanat ovat samanpituiset
ja jollain kohtaa kaksi peräkkäistä kirjainta on vaihtanut paikkaansa.

                        * * *

Survon komentosanojen tarkkailu edellä esitettyyn tyyliin tulee voimaan
versiosta 2.15 lähtien. Huomattakoon, ettei se lisää systeemin
rasitusta lainkaan eikä hidastuta käyttöä.
Komentosanavaihtoehdot ilmestyvät näyttöön vain, kun toiminta muutenkin
keskeytyisi virheilmoitukseen. Tarkkailu tapahtuu erilliseksi
tekemässäni ohjelmassa, joka käynnistyy ainoastaan virhetilanteissa.

Kuten sanoin jo aiemmin, täsmennyssanojen tutkinta vaatii enemmän
harkintaa ja työtä. Kerron heti lisää, kun aihetta ilmenee.

-Seppo

Vastaukset:

Survo-keskustelupalstan (2001-2013) viestit arkistoitiin aika ajoin sukrolla, joka automaattisesti rakensi viesteistä (yli 1600 kpl) HTML-muotoisen sivukokonaisuuden. Vuoden 2013 alusta Survo-keskustelua on jatkettu entistäkin aktiivisemmin osoitteessa forum.survo.fi. Tervetuloa mukaan!

Etusivu  |  Keskustelu
Copyright © Survo Systems 2001-2013. All rights reserved.
Updated 2013-06-15.