[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!