# R kód, týkajúci sa diplomovej práce Analýza špecifických dezinformačných # naratívov v slovenskom informačnom priestore od Jakub Rybár # Kód reprezentuje prevedenie LDA analýzy spolu s čistením a spracovaním # dát a následná analýza # inštalácia potrebných balíkov install.packages('stm') install.packages('geometry') install.packages('Rtsne') install.packages('rsvd') install.packages('tm') install.packages('udpipe') install.packages('quanteda') # spustenie knižnice quanteda library(quanteda) # spustenie knižnice pre lematizáciu library(udpipe) # načítanie jazykového modelu pre slovenský jazyk dl <- udpipe_download_model(language = "slovak") udmodel_sk <- udpipe_load_model(file = dl$file_model) # načítanie zvoleného dokumentu # pred načítaním je potrebné excelový soúbor uložiť vo formáte csv utf-8 text <- read.csv("C:\\Users\\jakub\\Documents\\textfin.csv", sep=";") # zobrazenie názvov stĺpcov names(text) # načítané texty musia byť tokenizované # v prvom rade treba vytvoriť stĺpec, kam se vpíše tokenizovaný text # následne prebieha tokenizácia, spolu s odstránením čísel, interpunkcie, symbolov a URL adries text$tokeny <- NA for(i in 1:length(text$Fulltext)){ texttokeny <- (tokens(as.character(text$Fulltext[i]), remove_numbers=TRUE, remove_punct=TRUE, remove_symbols=TRUE, remove_url=TRUE)) text$tokeny[i] <- paste(texttokeny, collapse=', ' ) } # vytvorené tokeny musia byť následne lemmatizované # vytvorenie stĺpca, kam se vpíšu lemmy text$lemma <- NA for(i in 1:length(text$tokeny)){ x <- as.data.frame(udpipe_annotate(udmodel_sk, x = text$tokeny[i])) text$lemma[i] <- toString(x$lemma) } # následne sú odstránené všetky požadované stopslová # každý jeden príkaz odstráni zadané slovo zvlášť # okolo slova musí byť medzera a čiarka, inak zmaže všetky slová, v ktorých sa dané slovo nachádza # príkaz slovo2 treba nakopírovať a "slovo2" treba zmeniť na slovo, ktoré chceme odstrániť text$lemma_ok <- gsub( " slovo1,", "", text$lemma ) text$lemma_ok <- gsub( " slovo2,", "", text$lemma_ok ) text$lemma_ok <- gsub( " slovo2,", "", text$lemma_ok ) # opätovné spustenie tokenizácie na presmerovanie z "text$lemma_ok" do "tokens_original" tokens_original <- tokens(as.character(text$lemma_ok), remove_numbers=TRUE, remove_punct=TRUE, remove_symbols=TRUE, remove_url=TRUE) # vytvorenie dokument matrixu, spolu s tranformáciou veľkých písmen na malé a odstránením interpunkcie document_term_matrix <- dfm(tokens_original, tolower=TRUE, stem=FALSE, remove_punct=TRUE) # zmazanie najčastejších a najmenej častých slov # hodnotu zadáva výskumník, pričom by mala predstavovať 1% z článkov document_term_matrix_2 <- dfm_trim(document_term_matrix, min_count=1, max_docfreq = 2927) document_term_matrix_3 <- dfm_trim(document_term_matrix_2, min_count=1, min_docfreq = 30) # teraz môžeme pozorovať najčastejšie slová v korpuse # ak sú prítomné stopslová, ktoré chceme odstrániť, doplníme do stopslov na odstránenie a proces opakujeme words <- colSums(document_term_matrix_3) words_decreasing <- sort(words, decreasing = TRUE) words_decreasing # načítanie ďalších knižníc library(stm) library(geometry) library(Rtsne) library(rsvd) # konvertujeme dokument matrix na stm formát za účelom ďalšieho postupu stm_format <- convert(x=document_term_matrix_3, to="stm") # aplikácia Lee and Mimno algoritmu na identifikáciu "správneho" počtu tém # stačí nechať bežať len prvý krát # "správny" počet tém určuje počet tém, ktoré algoritmus navrhne v iterácii algorithm <- searchK(documents=stm_format$documents, vocab=stm_format$vocab, K=0, init.type="Spectral") # je potrebné si určiť, pre koľko tém vykonáme diagnostiku k_vector <- c(56:66) # prevedenie diagnostiky # môže zabrať veľa času k_top_result <- searchK(documents=stm_format$documents, vocab=stm_format$vocab, K=k_vector, init.type="LDA") # vizualizácia diagnostiky pomocou 4 grafov # je pravdepodobné, že každý krát budú mierne odlišné výsledky plot(k_top_result) # vytvorenie topic modelu # K určuje počet tém # v našom prípade 66 tém # výsledky sa môžu mierne líšiť každým pokusom topic_model_66 <- stm(document_term_matrix_3, K=66, init.type="LDA") # vyobrazenie a popis tém, reprezentovaný kľúčovými slovami labelTopics(topic_model_66) # hľadanie najviac asociovaných článkov s danou témou # "topics" reprezentuje danú tému # "n" reprezentuje počet článkov, ktoré chceme nájsť findThoughts(topic_model_66, text$tokeny, topics=42, n=3) # vizualizácia grafu s najčastejšími témami v korpuse # najčastejších 22 tém plot.STM(x=topic_model_66, type="summary", labeltype="frex", ylim=c(45,66)) # stredných 22 tém plot.STM(x=topic_model_66, type="summary", labeltype="frex", ylim=c(23,44)) # najmenej častých 22 tém plot.STM(x=topic_model_66, type="summary", labeltype="frex", ylim=c(1,22)) # môžeme vyobraziť hodnotu theta topic_model_66$theta # vytvorenie grafu prevalencie témy v čase - v obdobiach # v prvom rade treba vytvoriť premenné období, kam texty patria # taktiež treba určiť ich poradie obdobi <- NA obdobi[1:283] <- 1 obdobi[284:1667] <- 2 obdobi[1668:2957] <- 3 obdobi <- c(1:2957) # vizualizácia grafu témy s prevalenciou v čase # miesto (c(24) treba dosadiť tému, ktorú chceme vizualizovať # to isté treba spraviť v topics=24 effect_topic <- estimateEffect(c(24)~s(obdobi), stmobj = topic_model_66, metadata = NULL, uncertainty = "Global") plot_effect_topic_1 <- plot.estimateEffect(effect_topic,covariate="obdobi", model=topic_model_66,topics=24, method="continuous")