2013. január 27., vasárnap

R : a meaningful bejegyzésekről

Az elmúlt héten egy nagy online piackutatáson dolgoztam, amely során sok-sok blogbejegyzést, fórum-postot és twitter csippet néztem át. A nagy social media monitoring eszközök egyelőre leginkább kulcsszó-alapon hozzák a találatokat, de messze nem olyan jók az eredmények, mint mondjuk egy kereső-motor esetében. Persze ez érthető, hiszen míg a weben sok tényező alapján lehet rangsorolni a dokumentumokat, a szociális médiában megjelenő postoknál sokkal kevesebb ilyennel rendelkezünk. Így tehát, sajnos, sok a rossz, irreleváns találat, és ezek feldolgozásánál emberi munkát kell bevetni.

De engem azért mégis érdekel, mi különböztet meg egy irreleváns postot (blogbejegyzést, tweet-et, facebook hozzászólást) egy értékestől. Eddig még semmit sem olvastam ebben a témában, úgyhogy naív, próba-szerencse alapon látok neki a dolognak. Valódi kutatáshoz felhasznált, valódi adatokat néztem meg: az egyik legnagyobb nemzetközi social media monitoring eszköz által generált 300 fórum hozzászólás, amelyből 48 bizonyult (emberi átnézés után) "meaningful"-nak, vagyis értékelhető információt is tartalmazónak. A többi vagy nem releváns, vagy spam.

Úgy gondolom, hogy a "jó" hozzászólást onnan lehet megismerni, hogy "jó" kulcsszavakat tartalmaz. A kulcsszavak felismerése azonban bonyolult -- az sem jó, ha túl általánosak, és az sem jó, ha túl specifikusak. Specifikus, csak az adott hozzászólásra jellemző kulcsszót pl. a TF-IDF módszerrel lehet generálni, általános kulcsszavakat pedig egy egyszerű term frequency számítással.

A kettő közötti arany középút keresését egy plottal kezdtem:




Itt egy log-log skálán látható a két korpusz kulcsszó-eloszlása:

plot(diff[1:1500]*3, log = "y", col = "red")
points(TF_sorted, col = "blue")


A kék pontok a teljes (vagyis a jó és a felesleges dokumentumokat is tartalmazó) korpuszra vonatkoznak -- becsületesen ki is rajzolják a Zipf-eloszlást. A piros pontok jelölik a "jó dokumentumok" kulcsszavait.

Két csavar van a dologban:
Mind a kék, mind a piros pontok X tengelyén ugyanott vannak a kulcsszavak, hiszen máskülönben a piros pontok is csak egy többé-kevésbbé szabályos Zipf-eloszlást produkálnának. Ezt így oldottam meg (biztosan lehet elegánsabban is):

diff <- rep(0, length(TF_sorted) )
names(diff) <- names(TF_sorted)
for (i in 1:length(names(TF2)) ) { nm <- names(TF2)[i]; diff[nm] <- TF2[nm]}


A második csavar, hogy a piros pontok értékeit megszoroztam hárommal, hiszen sokkal kisebb halmazzal dolgozom (pontosan 6.25-ször kisebbel)).

Mit látunk? Hogy a meaningful postok (piros) kulcsszavai más eloszlást rajzolnak ki, mint a teljes korpuszé. Minket most a felfelé kilógó kulcsszavak érdekelnek, hiszen ezek "jobban jellemzik" a meaningful halmazt.

diff3 <- diff * 3
diff3 <- diff3 - TF_sorted
positive <- function(x) { if (x > 0) return (TRUE) else (FALSE) }
Filter(positive, diff3[100:500])


A fenti sorokkal azokat a pontokat (kulcsszavakat) választjuk ki, amelyek felfele lógnak ki (positive TRUE).



Sajnos, a kulcsavak nem magyarul vannak ;)
Persze még így is jócskán tartalmaznak általános, érdektelen kulcsszavakat, de messze jobb a merítés így, mintha csak egyszerűen term-frequencyt-t mérnénk a teljes meaningful korpuszon.

Még több kód erre (evernote firka)








Nincsenek megjegyzések:

Megjegyzés küldése