Labádi Gergely </filológia>

Távoli olvasó ír–olvas

Csoportos fájlfeldolgozás

A két eddigi poszt alapján sokmindent meg lehet csinálni egy-egy fájllal/változóval. De mi van sok szöveget akarunk (pontosítok: nem akarunk) elolvasni (mechanikusabb kifejezéssel, és pontosabban: feldolgozni)? Az R-ben erre is van(nak) megoldás(ok). Persze ezek azok, amelyeket én ki tudtam guglizni, helpdeszkázni magamnak. És ez még mindig a microanalysis. Ha Isten úgy akarja, lesz több poszt a többi témából is (mezo- és macroanalysis).

1. Csoportos beolvasás

  • Jókai Mórnak a MEK-en található Árnyképek című novelláskötetét olvassuk be novellánként. Először sajnos el kell mentegetnünk külön .txt fájlként mind a nyolcat. Mivel nincsenek olyan elemek, amelyeket könnyen megtalálhatnánk, ezért automatikusan megkerestetni a novellahatárokat nem lehet. Miután ezt megcsináltuk, utána olvassuk be őket az RStudio-ba (az # továbbra is az én kommentárom, nem kell beírni, a > pedig a promptjel, nem kell beírni – a botrányos tördelés pedig a keretrendszer bágja vagy fícsöre – kinek hogy [nem] tetszik).
# 1. lépés: először elmentettük a `.txt`-s fájlneveket a `filenames` változóba abból a könyvtárból, ahol a fájlok vannak
> filenames <- list.files(path="~/Documents/distantreading/R_gyakorlatok/rutmutato/arnykepek", pattern="*.txt")

# 2. lépés: beolvassuk magukat a fájlokat a `filelist` nevű listába. A listának nyolc eleme van, mindegyik egy-egy fájlt tartalmaz bekezdésenként beolvasva, minden elemnek a saját fájlneve a jelölője
> filelist <- lapply(filenames, readLines)

# 3. lépés: az egyes elemeket mentsük külön karaktervektorba, az eredmény 8 darab változó lesz: arnykepek1, arnykepek2 stb.
> list2env(setNames(filelist,paste0("arnykepek",seq_along(filelist))), envir = parent.frame())

2. Csoportos feldolgozás

  • Az eddigi lépések végére érve van nyolc változónk, amelyek bekezdésenként tartalmazzák a nyolc novellát. Ebből még nem sok elemzés jön ki, de ha az egyes szövegek érdekelnek bennünket, akkor az előző posztok alapján (egyik, másik) lehet dolgozni velük.
  • Ellenben tovább is dolgozhatunk a nyolc novellával együtt: ejtsük ki az írásjeleket és kisbetűsítsük. (1)
  • Keressük meg mind a nyolc novellában az “árny” karaktersort! (mivel egy nem feldolgozott fájl az alap, ezért a “szárnyak” is találat lesz – anagrammatikus olvasat) (2)
  • Hozzunk létre egy arnyido nevű változót, amely olyan hosszú, mint az egyes novellák (a szavainak egymásutánját értve a novellaidő alatt) (3), majd jelöljük, hol fordul elő az “árny” karaktersor! (4)
  • Ábrázoljuk mind a nyolc novellában az “árny” előfordulását a történet előrehaladtával! (5)
  • Keressük meg a nyolc novella közös szóalakjait és mentsük el az l változóba (majd nézzük meg)! (6)
# De még ezek előtt hívjuk be (még előtte: töltsük le) a `gsubfn` csomagot – értelemszerűen, ha utána ki akarjuk menteni az egyes fájlokat, akkor az előző pont 3. lépését kell alkalmazni, de a `filelist` helyeire az `n` listaváltozót kell írni (már ha az én példámat követi valaki).

# (1)
n <- strapply(filelist, "(\\w+)")
n <- sapply(n, tolower)
#(2)
arny <- lapply(n,function(x) grep("árny",x))
# (3)
arnyido <- lapply(n, function(x) rep(NA, length(n[x])))
# (4)
for(i in seq_along(arnyido)){arnyido[[i]][arny[[i]]] = 1}
# (5) Sajnos nem sikerült megoldanom, hogy mindegyik fölé a saját címét/számát írja ki. Minden segítséget köszönök.
for(i in seq_along(kkk)){plot(kkk[[i]], main="Az 'árny' karaktersor eloszlása Az árnyképek novelláiban",xlab="Novellaidő", ylab="árny", type="h", ylim=c(0,1), yaxt='n')}
# (6)
l <- Reduce(intersect,n)
l # Ez hát egy "tipikus" Árnyképek-novella... :)
  • És így fognak kinézni: arnykepek1 arnykepek2 arnykepek3 arnykepek4 arnykepek5 arnykepek6 arnykepek7 arnykepek8

3. Csoportos kiírás

  • Miután elemeztünk, amit szerettünk volna, a nyolc fájl anyagát egyetlen paranccsal ki is írathatjuk nyolc különböző .txt-fájlba. Most az n változó anyagát fogom kiíratni: kisbetűs, szavakra bontott, jelen állapotában. Nyilván máskor, más állapotokra is jó. A fájlnév az eredeti fájlnév lesz. (Jelen állapotban kissé furcsán fog kinézni, mert kétszer lesz benne a .txt. Ha zavar, akkor az alábbi kódban a ".txt" helyére ezt kell írni: "".)
for (i in 1:length(n)){
     outname <- paste("", filenames[i], ".txt", sep= "")
     write.table(n[[i]], outname, col.names= F, row.names= F, quote= F)
 }