Instagram Comments Scraper

Artikel ini adalah hasil uji coba kombinasi penggunaan Python dan R untuk melakukan Text Mining pada komentar-komentar di Instagram. Scraping komentar di Instagram menggunakan instagram-scraper di Python, selengkapnya bisa dilihat di website berikut https://github.com/arc298/instagram-scraper.

Contoh yang digunakan di artikel ini adalah komentar Instagram akun @kumparancom dan @narasinewsroom pada unggahan/posting tentang perintah Pak Jokowi untuk menurunkan harga PCR. Karena output yang dihasilkan dari instagram-scraper bentuknya adalah .json maka untuk memudahkan pekerjaan di R kita akan ambil data yang diperlukan dan diubah bentuk datanya. Berikut adalah package yang diperlukan:

magrittr
magicfor
jsonlite
tm
qdapRegex
knitr
wordcloud2

Selanjutnya kita akan panggil data .json yang telah tersimpan di folder sebelumnya untuk dilakukan proses ekstraksi data

EXTRACT DATA

library(magrittr)
library(magicfor)
library(jsonlite)
library(tm)
library(qdapRegex)
library(knitr)
library(wordcloud2)
loc1 <- c("https://raw.githubusercontent.com/jakajek/current-projekt/main/data/kumparancom.json")
loc2 <- c("https://raw.githubusercontent.com/jakajek/current-projekt/main/data/narasinewsroom.json") 
rslt1<-fromJSON(loc1, flatten=TRUE)
rslt2<-fromJSON(loc2, flatten=TRUE)
str(rslt1);str(rslt2)
rslt.df1<-as.data.frame(rslt1)
rslt.df2<-as.data.frame(rslt2)
kumparan <- rslt.df1[[16]][[21]]; kumparan$sumber <- "@kumparancom"
narasi <- rslt.df2[[16]][[15]]; narasi$sumber <- "@narasinewsroom"
gabung <- rbind(kumparan,narasi)
Timestamp <- gabung$created_at
Username <- gabung$owner.username
Comments <- gabung$text
IG_table1<-cbind(Timestamp,Username,Comments) %>% as.data.frame()

Berikut adalah contoh hasil ekstraksi data tersebut

kable(head(IG_table1), caption = "Contoh Hasil Ekstraksi Data")
Contoh Hasil Ekstraksi Data
Timestamp Username Comments
1629082702 alfianituti @arrycarrol9 deal gan
1629082829 sulaidiliau @alfianituti okee.. saya kasi diskon harga rakyat jelata 75% lagi. Besok pergi test yaa. Haha
1629083061 sulaidiliau @kejumozzarela pcr uda diskon, moza nya ga diskon kak??
1629083465 handoko311203 @aryoariotedjo india kan mem produksi sendiri alat pcr nya sedangkan indonesia impor alat pcr nya
1629083541 thedonut._ Minta minta… Giliran saya minta minta ga dikasih..
1629084699 nurulemsu <U+0001F622>

PREPROCESSING DATA

Pada bagian ini akan dilakukan preprocessing data yang mana data tersebut akan “diolah” terlebih dahulu. Berikut adalah tahapannya

Cleaning Untuk membuat Wordcloud yang diperlukan hanyalah data komentar

comment.txt <- IG_table1$Comments %>% as.data.frame()

Selanjutnya data tersebut akan kita bersihkan, mulai dari menghapus simbol dan angka hingga merubah huruf kapital menjadi kecil

# remove entities
a11 = gsub("(RT|via)((?:\\b\\W*@\\w+)+)", " ", comment.txt)
# remove at people
a11 = gsub("@\\w+", " ", a11)
# remove emoticon
a11 = iconv(a11,"latin1", 
            "ASCII", sub = " ")
# lower
a11 = tolower(a11)
# remove punctuation
a11 = gsub("[[:punct:]]", " ", a11)
a11 = gsub("[^0-9A-Za-z///' ]","'" , a11 ,ignore.case = TRUE)
a11 = gsub("''","" , a11 ,ignore.case = TRUE)
# remove numbers
a11 = gsub("[[:digit:]]", " ", a11)
# remove html links
a11 = gsub("http\\w+", " ", a11)

Pada proses data cleaning hal yang harus diperhatikan adalah menghapus stopwords atau kata yang tidak memiliki makna apapun

require(tau)
GetStopWords <- function() {
  stop.words <- readLines("C:/Users/User/Desktop/tools/R/corpus/stop.txt", encoding="latin1")
  return(stop.words)
}
KStpTerms <- GetStopWords()
## karena terbatas, maka dipecah dulu
group <- 3400
n <- length(KStpTerms)
r <- rep(1:ceiling(n/group), each=group)[1:n]
d <- split(KStpTerms, r)

a11 <- Corpus(VectorSource(a11))
a11 = tm_map(a11, removeWords, c(d[[1]]))
a11 = tm_map(a11, removeWords, c(d[[2]]))
a11 <- data.frame(text=get("content", a11), check.rows = T)
a11 <- a11$text

Jika ada kata yang ingin dihapus selain stopwords maka kita bisa menggunakan cara berikut:

rmvwrds <- c('jokowi', 'ribu', 'pcr') #disesuaikan dengan kebutuhan
a11 = removeWords(a11,rmvwrds)

Untuk memastikan proses data preprocessing berjalan dengan baik, maka kita akan mengulangi proses tersebut

a11 = gsub("(RT|via)((?:\\b\\W*@\\w+)+)", " ", a11)
# remove at people
a11 = gsub("@\\w+", " ", a11)
# remove emoticon
a11 = iconv(a11,"latin1", 
            "ASCII", sub = " ")
# remove punctuation
a11 = gsub("[[:punct:]]", " ", a11)
a11 = gsub("[^0-9A-Za-z///' ]","'" , a11 ,ignore.case = TRUE)
#a11 = gsub("''","" , a11 ,ignore.case = TRUE)
a11 = gsub("[[:digit:]]", " ", a11)
# remove html links
a11 = gsub("http\\w+", " ", a11)
# remove nchar <3
a11 = rm_nchar_words(a11,"1,3")
#remove blank spaces at begining
a11 = gsub("^ ", "", a11)
# remove unnecessary spaces
a11 = gsub("[ \t]{2,}", " ", a11)
a11 = gsub("^\\s+|\\s+$", " ", a11)

# define "tolower error handling" function 
try.error = function(x)
{
  # create missing value
  y = NA
  # tryCatch error
  try_error = tryCatch(tolower(x), error=function(e) e)
  # if not an error
  if (!inherits(try_error, "error"))
    y = tolower(x)
  # result
  return(y)
}
# lower case using try.error with sapply 
a11 = sapply(a11, try.error)
a11 = gsub("[[:punct:]]", "", a11)

# remove NAs in some_txt
a11 = a11[!is.na(a11)]
names(a11) = "Comments"

Berikut adalah contoh data yang sudah melalui proses cleaning

head(strwrap(a11))
## [1] "deal okee kasi diskon harga rakyat jelata besok pergi test haha diskon" 
## [2] "moza diskon india produksi alat indonesia impor alat giliran dikasih"   
## [3] "mahal lumayan gede ongkir wkwkwk turun harga harga ending membagongkan" 
## [4] "harusx instruksikan mentri kesehatan menurunkan harga sesuai"           
## [5] "kesanggupan rakyat mantap naikin sampe perut rakyat tusukan cilok sampe"
## [6] "napa juta kemahalan gratis cocok hizz sgitu mahal maks pendam emang"

WORDCLOUD

Tahapan selanjutnya, setelah preprocessing data selesai dan dipastikan data tidak mengandung simbol, angka, emoticon, spasi ganda, dan kata yang tidak memiliki makna, data tersebut dapat kita gunakan untuk membuat wordcloud. Saat membuat wordcloud hal pertama yang harus dilakukan adalah mentransformasi data tersebut kedalam corpus yang selanjutnya akan kita ubah bentuk datanya menjadi matrix untuk melihat frekuensi kemunculan kata pada data

corpus_tm <- Corpus(VectorSource(a11))
find_freq_terms_fun <- function(corpus_in){
  library(dplyr)
  doc_term_mat <- TermDocumentMatrix(corpus_in)
  freq_terms <- findFreqTerms(doc_term_mat)[1:max(doc_term_mat$nrow)]
  terms_grouped <-
    doc_term_mat[freq_terms,] %>%
    as.matrix() %>%
    rowSums() %>%
    data.frame(Term=freq_terms, Frequency = .) %>%
    arrange(desc(Frequency)) %>%
    mutate(prop_term_to_total_terms=Frequency/nrow(.))
  return(data.frame(terms_grouped))
}
freq_terms <- data.frame(find_freq_terms_fun(corpus_tm))

Selanjutnya untuk membuat wordcloud kita akan mengunakan package wordcloud2 berikut adalah hasilnya