R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Sanojen kyselyfunktio kielen opiskelun avuksi

Monet aloittavat uuden ohjelmointikielen opettelun toteuttamalla ensimmäisenä klassisen ”Hello World!” -ohjelman. Minä olen korvannut sen omassa opiskelussani vieraiden kielten sanojen kyselyohjelmalla. Olen aiemmin tehnyt saman sovelluksen ainakin Basic-, Pascal- ja Java-kielillä. Mutta vasta nyt, 15 vuotta R:ää käytettyäni, ehdin tekemään saman R:llä.

Idea on yksinkertainen: Tehdä ohjelma, jolle voi antaa listan sanoja suomeksi ja vieraalla kielellä, ja ohjelma arpoo niistä kysymänsä sanat. Idea sai alkunsa, kun havaitsin, että uuden kielen sanastosta ei enää opi uusia sanoja, koska muistaa jo edellisestä sanasta mikä on seuraavana listassa. Sanojen paikat pitää siis pystyä satunnaistamaan, jotta opiskelu edistyy.

Ohjelma on varsin simppeli. R:ssä funktio näyttää seuraavalta:

trim <- function (x) gsub("^\\s+|\\s+$", "", x)
 
kysele3<-function(sanalista, n=10, kieli="englanniksi") {
   require(beepr)
   if(n>nrow(sanalista)) {
      n<-nrow(sanalista)
   }
   dat<-sanalista[sample(1:nrow(sanalista), n),]
   pisteet<-0
 
   if(kieli!="suomeksi") {
      for(i in 1:nrow(dat)) {
         vastaus <- readline(prompt=paste0("Mikä on '", dat$suomi[i], "' ", kieli, " ?  "))
         oikeavastaus<-trim(strsplit(as.character(dat$englanti[i]), ",")[[1]])
            if(vastaus %in% oikeavastaus) {
               pisteet<-pisteet+1
               beep(1)
               cat("Oikein!\n") 
               cat(paste0("Olet vastannut oikein ", pisteet, " / ", n, " kysymykseen.\n\n"))
            } else {
               cat(paste0("Väärin. Se on jokin seuraavista: ", dat$englanti[i], " .\n\n"))
               beep(10)
            }
      }
   }
 
   if(kieli=="suomeksi") {
      for(i in 1:nrow(dat)) {
         kysymys<-trim(strsplit(dat$englanti[i], ",")[[1]])
         vastaus <- readline(prompt=paste0("Mikä on '", kysymys[sample(1:length(kysymys), 1)], "' ", kieli, " ?  "))
            if(vastaus %in% as.character(dat$suomi[i])) {
               pisteet<-pisteet+1
               cat("Oikein!\n") 
               beep(1)
               cat(paste0("Olet vastannut oikein ", pisteet, " / ", n, " kysymykseen.\n\n"))
            } else {
               cat(paste0("Väärin. Se on : ", dat$suomi[i], " .\n\n"))
               beep(10)
            }
      }
   }
 
   cat(paste0("Kysely loppui. Sait ", pisteet, " / ", n, " oikein.\n\n")) 
}

Funktiota kutsutaan yksinkertaisesti antamalla sille sanalista (sanat10), siitä arvottavien sanojen määrä, ja kyselyn suunta (”englanniksi”):

kysele3(sanat10, kieli="englanniksi")

Lisäksi voi toki valita arvottavien sanojen määrän, joka on oletusarvoisesti 10:

kysele3(sanat10, 20, kieli="englanniksi")

Sanat10 voi olla sisällöltään esimerkiksi seuraava:

sanat10<-structure(list(suomi = c("yksi", "kaksi", "kolme", "neljä", "viisi", 
"kuusi", "seitsemän", "kahdeksan", "yhdeksän", "kymmenen", "yksitoista", 
"kaksitoista", "kolmetoista", "neljätoista", "viisitoista", "kuusitoista", 
"seitsemäntoista", "kahdeksantoista", "yhdeksäntoista", "kaksikymmentä"
), englanti = c("one", "two", "three", "four", "five", "six", 
"seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", 
"fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", 
"twenty")), .Names = c("suomi", "englanti"), row.names = c(NA, 
20L), class = "data.frame")

Ääniefektit kertovat vastausten olevan oikein tai väärin. Tarvittaessa äänet voi vaihtaa vaikka fanfaariksi (3) ja haulikon laukaukseksi (7). Lisäksi ohjelma laskee myös pistemäärän. Oikeista vastauksista saa yhden pisteen, vääristä ei saa pistettä. Myös oikea vastaus kerrotaan väärän vastauksen jälkeen.

Muokkasin omaan käyttöön 125 000 suomenkielisen sanan aineiston. Se on suoraan sanottuna masentava: ’Vesijättömaa’ (accretion), ’lahna’ (bream), ’sekuntiviisari’ (sweep hand) – ja kaikki väärin, taas!

EDIT 2015-09-24

Monissa löytämissäni sanastoissa voi olla lisenssongelma. Tässä ohje eräänlaisen sanaston laadintaan.

1) Lataa tiedosto osoitteesta https://raw.githubusercontent.com/GrammaticalFramework/GF/master/lib/src/finnish/wordnet/Ven_fi.txt, ja vie se R:ään. Copy-Paste työpöydälle, ja R:ssä:

sanat<-read.table("clipboard", header=F, sep="\t", fileEncoding="UTF-8", comment.char="", quote="")

pitäisi toimia.

2) Aggregoi englanninkieliset sanat suomenkielisille sanoille:

sanat2<-aggregate(sanat$V1, list(sanat$V2), function(x) paste(x, collapse=",")).

3) Muuta sanaston otsikot seuraavasti:

colnames(sanat2)<-c("suomi", "englanti").

Tulostiedosto on sanat2 myös ZIP-pakattuna R:n binäärimuotona. Katso myös sanaston lisenssi.

4) Aloita kysely:

kysele3(sanat2, 10).

2 Responses to “Sanojen kyselyfunktio kielen opiskelun avuksi”

  • Mika kirjoitti:

    Loistavaa!

    Kiitos :-)

    Kokeilin koodia. Äänien kanssa vielä hieman ongelmia, mutta esimerkki on tosi hyvä ja hauska.

    Voi kun omistaisin sellaisen 125 000 sanan aineiston. hmm…. 😉 😉

    Terkuin,
    Mika

  • Jarno Tuimala kirjoitti:

    Hei Mika!

    Päivitin artikkeliin ohjeen aineistojen muodostamiseksi (ks. EDIT). Tuo GrammaticalFrameworkin sanasto on tosin vain reilut 10 000 sanaa, mutta ehkä sillä pääsee alkuun.

    T. Jarno


Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *