Langsung ke konten utama

Natural Language Processing (NLP) Penerapan Stopwords Bahasa Indonesia dengan R: Topik Sepinya Jalur Pantura Akibat Adanya Tol Trans Jawa

Natural Language Processing : Stopwords Bahasa Indonesia dengan R Halo teman-teman, berjumpa lagi dengan blog sederhana ini. Pada pembahasan sebelumnya, kita telah bersama belajar penerapan stemming teks yang merupakan bagian dari Natural Language Processing (NLP) menggunakan R. Pada perjumpaan kali ini, kita akan melanjutkan perjuangan kita berbagi ilmu mengenai NLP, tepatnya adalah penerapan stopwords Bahasa Indonesia dengan R. Perlu diketahui bahwa di dalam NLP, untuk menambah keluasan dan mempertajam analisis teks, proses stemming teks saja belum cukup. Kita juga perlu membersihkan teks yang relatif atau mutlak tidak bermakna di dalam analisis teks. Biasanya teks yang dieliminasi dalam NLP merupakan kata penghubunga atau konjungsi, atau kata yang berupa ekspresi yang bercampur di dalam data teks, misalkan ekspresi tertawa "wkwk", ekspresi penolakan "gak, nggak, tidak, atau gk", bahasa asing (selain Indonesia), atau juga kata-kata yang tidak memenuhi kaidah ta

Best Tutorial: Scraping dan Visualisasi Trending Topic Twitter dengan R

Scraping trending topic Twitter dengan R

Salam sehat teman-teman, kita berjumpa kembali pada blog sederhana ini. Pada unggahan sebelumnya, kita telah membahas mengenai machine learning berjenis supervised learning, yaitu model Decision Tree untuk klasifikasi sekaligus regresi dan step by step praktiknya dengan R. Bagi teman-teman yang berminat menyimak keseruannya, bisa mengunjungi tautan ini.

Kali ini kita akan melanjutkan belajar dan berbagi mengenai bagaimana cara melakukan scraping topik yang sedang trending di Twitter menggunakan R. Beberapa unggahan sebelumnya, dalam blog ini sebenarnya telah membahas mengenai aktivitas scraping, namun penerapannya adalah pada blog atau website. Teman-teman yang berminat mempelajari cara web scraping, bisa berkunjung pada tautan berikut. Inti dari scraping sendiri merupakan aktivitas hacking untuk memperoleh sebagian data atau informasi atau informasi tertentu secara langsung pada sebuah page atau laman baik itu media sosial, blog, atau lainnya sedemikian rupa untuk diolah menjadi sebuah informasi baru yang bermanfaat sekaligus menambah insight bagi pengguna data atau informasi tersebut.

Hal terpenting yang harus dilakukan dalam scraping adalah bagaimana kita menerapkan etika yang baik sebelum mendapatkan data atau informasi pada sebuah page. Salah satunya etika yang biasa diterapkan adalah dengan melihat status data atau informasi pada sebuah page atau laman tertentu, diperbolehkan melakukan scraping atau tidak. Hal ini bisa kita terapkan dengan menggunakan robots.txt.

Misalkan kita akan melakukan scraping berita dari detik.com, maka etika kita untuk melihat status laman tersebut diperbolehkan atau tidak adalah dengan melihat status atau warning menggunakan "https://www.detik.com/robots.txt", setelah kita enter akan muncul keterangan berikut:

Status robots.txt detik.com sebelum melakukan scraping berita

Itu kalau website atau situs. Lantas bagaimana etika untuk melakukan scraping media sosial Twitter? Uniknya, untuk melakukan baik scraping maupun crawling, Twitter menyediakan fasilitas bagi kita untuk menjadi developernya. Untuk menjadi developer Twitter, sejumlah tahapan diperlukan dengan memenuhi sejumlah syarat dan ketentuan yang ditetapkan oleh Twitter. Dengan menjadi developer inilah kita bisa memperoleh API Twitter sebagai sarana melakukan baik scraping maupun crawling data.

Kali ini, dengan menggunakan sarana tersebut, kita akan mencoba melakukan scraping topik yang sedang trending atau trending topic di Twitter kemudian kita akan memvisualisasikannya dalam bentuk awan kata (wordcloud) dengan menggunakan package wordcloud2 yang merupakan package pengembangan dari wordcloud serta untuk memperjelas visualisasi, kita juga akan menggunakan tampilan bar chart atau diagram batang menggunakan package ggplot2.

Untuk mendapatkan sejumlah Tweet dari Twitter, pada umumnya di R kita bisa memanfaatkan package rtweet untuk membuat token baru sebagai "jalan masuk" kita menggunakan API Twitter guna melakukan scraping kali ini. Untuk lebih tergambar lebih jelas, kita dapat mengikuti beberapa code dan hasil visualisasi sebagai berikut:

#Aktivasi Package rtweet
library(rtweet)
#Membuat Kredensial Akses Twitter dengan API
create_token(app = "xxxxxxxxxxxxxxx", consumer_key = "xxxxxxxxxxxxxxxxxxxxxx",
             consumer_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
             access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
             access_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
## <Token>
## <oauth_endpoint>
##  request:   https://api.twitter.com/oauth/request_token
##  authorize: https://api.twitter.com/oauth/authenticate
##  access:    https://api.twitter.com/oauth/access_token
## <oauth_app> xxxxxxxxxxxxxxx
##   key:    xxxxxxxxxxxxxxxxxxxxxx
##   secret: <hidden>
## <credentials> oauth_token, oauth_token_secret
## ---
#Melihat Trending Topic di Dunia
trend <- trends_available()
head(trend)
## # A tibble: 6 x 8
##   name      url                                      parentid country  woeid countryCode  code place_type
##   <chr>     <chr>                                       <int> <chr>    <int> <chr>       <int> <chr>     
## 1 Worldwide http://where.yahooapis.com/v1/place/1           0 ""           1 <NA>           19 Supername 
## 2 Winnipeg  http://where.yahooapis.com/v1/place/2972 23424775 "Canada"  2972 CA              7 Town      
## 3 Ottawa    http://where.yahooapis.com/v1/place/3369 23424775 "Canada"  3369 CA              7 Town      
## 4 Quebec    http://where.yahooapis.com/v1/place/3444 23424775 "Canada"  3444 CA              7 Town      
## 5 Montreal  http://where.yahooapis.com/v1/place/3534 23424775 "Canada"  3534 CA              7 Town      
## 6 Toronto   http://where.yahooapis.com/v1/place/4118 23424775 "Canada"  4118 CA              7 Town
#Melihat Trending Topic di Indonesia
trendindo <- get_trends("Indonesia")
head(trendindo)
## # A tibble: 6 x 9
##   trend         url   promoted_content query tweet_volume place  woeid as_of               created_at         
##   <chr>         <chr> <lgl>            <chr>        <int> <chr>  <int> <dttm>              <dttm>             
## 1 #SUMMER_X_TO~ http~ NA               %23S~        16053 Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 2 SMAN 1        http~ NA               %22S~           NA Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 3 TXT FEELS LI~ http~ NA               %22T~        27600 Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 4 #TokocryptoK~ http~ NA               %23T~           NA Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 5 #SmartphoneO~ http~ NA               %23S~        14432 Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 6 SDN 1         http~ NA               %22S~           NA Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
#Melihat Struktur data Keseluruhan
trendindo %>%
  glimpse()
## Rows: 50
## Columns: 9
## $ trend            <chr> "#SUMMER_X_TOGETHER", "SMAN 1", "TXT FEELS LIKE SUMMER", "#TokocryptoKeSurabaya", "~
## $ url              <chr> "http://twitter.com/search?q=%23SUMMER_X_TOGETHER", "http://twitter.com/search?q=%2~
## $ promoted_content <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ query            <chr> "%23SUMMER_X_TOGETHER", "%22SMAN+1%22", "%22TXT+FEELS+LIKE+SUMMER%22", "%23Tokocryp~
## $ tweet_volume     <int> 16053, NA, 27600, NA, 14432, NA, 68840, NA, NA, NA, NA, NA, NA, NA, 1016942, 17458,~
## $ place            <chr> "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indo~
## $ woeid            <int> 23424846, 23424846, 23424846, 23424846, 23424846, 23424846, 23424846, 23424846, 234~
## $ as_of            <dttm> 2022-06-24 09:25:58, 2022-06-24 09:25:58, 2022-06-24 09:25:58, 2022-06-24 09:25:58~
## $ created_at       <dttm> 2022-06-19 12:25:55, 2022-06-19 12:25:55, 2022-06-19 12:25:55, 2022-06-19 12:25:55~
#Melihat Volume Tweets dari Trending Topic
library(dplyr)
trendindo %>%
  select(trend, tweet_volume)
## # A tibble: 50 x 2
##    trend                     tweet_volume
##    <chr>                            <int>
##  1 #SUMMER_X_TOGETHER               16053
##  2 SMAN 1                              NA
##  3 TXT FEELS LIKE SUMMER            27600
##  4 #TokocryptoKeSurabaya               NA
##  5 #SmartphoneOPPOdariShopee        14432
##  6 SDN 1                               NA
##  7 #TOMORROW_X_TOGETHER             68840
##  8 #HBSBongkarKasusKM50                NA
##  9 Bangun Pertahanan Kita              NA
## 10 kerja fokus prabowo                 NA
## # ... with 40 more rows
#Memfilter Volume Tweets yang tidak NA
trendindo %>%
  select(trend, tweet_volume) %>%
  filter(tweet_volume != "NA")
## # A tibble: 27 x 2
##    trend                     tweet_volume
##    <chr>                            <int>
##  1 #SUMMER_X_TOGETHER               16053
##  2 TXT FEELS LIKE SUMMER            27600
##  3 #SmartphoneOPPOdariShopee        14432
##  4 #TOMORROW_X_TOGETHER             68840
##  5 nayeon                         1016942
##  6 Cinta Laura                      17458
##  7 Nestle                           18486
##  8 Left & Right                   1611240
##  9 Maria                           208737
## 10 FELIX 1ST SOLO FEATURE           50607
## # ... with 17 more rows
#Mengurutkan dari Volume Tweets yang terbanyak
trendindo %>%
  select(trend, tweet_volume) %>%
  filter(tweet_volume != "NA") %>%
  arrange(desc(tweet_volume))
## # A tibble: 27 x 2
##    trend                   tweet_volume
##    <chr>                          <int>
##  1 Left & Right                 1611240
##  2 SAFE FLIGHT LALISA           1532522
##  3 nayeon                       1016942
##  4 #LeftandRight                 853074
##  5 Sungwoon                      688908
##  6 BON VOYAGE KIM TAEHYUNG       421206
##  7 Music Bank                    234826
##  8 Maria                         208737
##  9 Carolina                      183464
## 10 Charles                        92568
## # ... with 17 more rows
#Memvisualisasikan Trending Topic Indonesia dengan Wordcloud
library(wordcloud2)
trendindo %>%
  select(trend, tweet_volume) %>%
  filter(tweet_volume != "NA") %>%
  arrange(desc(tweet_volume)) %>% 
  wordcloud2(size = 2, shape = "circle",minRotation = -pi/6, maxRotation = -pi/6,
             rotateRatio = 1)
Visualisasi Trending Topic Twitter Indonesia

#Visualisasi Tweets menurut waktu menit
trendindo %>%
  select(trend, tweet_volume) %>%
  filter(tweet_volume != "NA") %>%
  arrange(desc(tweet_volume)) -> barku
barku
## # A tibble: 27 x 2
##    trend                   tweet_volume
##    <chr>                          <int>
##  1 Left & Right                 1611240
##  2 SAFE FLIGHT LALISA           1532522
##  3 nayeon                       1016942
##  4 #LeftandRight                 853074
##  5 Sungwoon                      688908
##  6 BON VOYAGE KIM TAEHYUNG       421206
##  7 Music Bank                    234826
##  8 Maria                         208737
##  9 Carolina                      183464
## 10 Charles                        92568
## # ... with 17 more rows
library(ggplot2)
ggplot(data = barku, aes(x = reorder(trend, tweet_volume), y = tweet_volume, fill = as.factor(trend))) +
  geom_bar(stat = "identity") +
  theme(legend.position = "none") +
  coord_flip()+
  labs(x = "Trending Topik", y = "Frekuensi Tweet", caption = paste0("Sumber: Twitter, tanggal: ", Sys.Date())) +
  ggtitle("Barchart Trending Topik Twitter Indonesia")
plot of chunk unnamed-chunk-11
Bar Chart Trending Topic Twitter Indonesia

Terlihat bahwa visualisasi awan kata (wordcloud) dengan bar chart sedikit berbeda, karena pada wordcloud belum diatur lebih lanjut mengenai ukuran minimal atau rasio visualisasi wordcloud yang ditampilkan. Topik mengenai Left and Right dan SAFE FLIGHT LALISA tidak terlihat karena jumlah Tweetnya sangat besar. Sedangkan pada bar chart, kita dapat melihat seluruh trending topic dan lebih insightfull. Setidaknya, pada 24 Juni 2022 kemarin, terdapat 5 trending topic di Twitter Indonesia, yaitu Left and Right, SAFE FLIGHT LALISA, nayeon, #LeftandRight, dan Sungwoon, sepertinya topik-topik berkaitan dengan konser NCT DREAM, termasuk boygroup Korea masih menarik perhatian netizen Twitter di Indonesia.

Demikian sedikit ulasan mengenai bagaimana melakukan scraping Twitter menggunakan R. Bagi teman-teman yang berminat memperdalam pengetahuan bagaimana melakukan scapring dan crawling menggunakan R, saya telah menuliskannya dalam buku berjudul: Pengantar Data Mining dengan R Studio. Urgensi pembuatan buku tersebut adalah untuk mempersiapkan kita menuju gerbang Data Science dan Big Data serta perkembangan Artificial Intelligence yang begitu pesat saat ini. Pemesanan buku dapat melalui tautan berikut. Selamat memahami dan mempraktikkan!

Komentar

Postingan populer dari blog ini

Pemodelan Autoregressive Integrated Moving Average (ARIMA Model) dengan R

ARIMA dengan R Jumpa lagi teman-teman, sebelumnya saya mohon maaf karena kemarin tidak sempat membuat unggahan terbaru di blog ini. Baik, sebelumnya kita telah mengulas tentang pemodelan Geographically Weigthed Regression (GWR) dengan R. Kali ini, kita akan melanjutkan belajar bersama mengenai pemodelan yang tak asing lagi dan populer hingga kini, yaitu pemodelan Autoregressive Integrated Moving Average (ARIMA). Kita akan membahas ARIMA secara langsung tanpa membahas AR dan MA secara tersendiri mengingat pada dasarnya ARIMA adalah model perpaduan antara model AR dengan order p , MA dengan order q dan aspek differencing dengan order d . Artinya, ketika kita mendengar istilah AR(1), maka sebenarnya itu adalah ARIMA(1, 0, 0), ketika kita mendengar ARI(1,1), maka aslinya itu ARIMA(1, 1, 0), atau bila mendengar MA(3), itu sebenarnya ARIMA(0, 0, 3) atau IMA(2,1) sebenarnya adalah ARIMA(0, 2, 1). Data runtun waktu atau time series merupakan salah satu jenis data yang hingga kini banyak digun

Machine Learning: Memahami Reinforcement Learning

Reinforcement Learning Halo teman-teman, pada pembahasan sebelumnya, kita telah berusaha memahami mengenai supervised learning dan unsupervised learning . Sebelum lanjut ke pemodelan statistik selanjutnya, ada baiknya kita membahas tentang satu lagi jenis algoritma machine learning yang akhir-akhir ini banyak digunakan dalam membentuk artificial intelligence (AI), yaitu algoritma reinforcement learning . Kita ke pengertian berdasarkan studi literatur daring ( online ) dulu teman-teman. Saya coba mengambil salah satu pengertian reinforcement learning, misalkan dari situsnya Algoritma, menyatakan bahwa reinforcement learning merupakan algoritma yang diterapkan untuk pembelajaran mesin ( machine learning ) sedemikian rupa sehingga dapat menentukan aksi yang tepat dan pada akhirnya sebuah program dapat bekerja secara otomatis memberikan hasil atau putusan yang benar. Lebih lanjut dalam situs algoritma mengangkat sebuah perumpamaan reinforcement learning dengan menggunakan proses penugasan

Machine Learning: Perbedaan Supervised Learning dan Unsupervised Learning

Perbedaan supervised learning dan unsupervised learning Halo teman-teman, kemarin kita telah mengawali bahasan mengenai salah satu anggota dari Machine Learning sekaligus merupakan contoh dari algoritma supervised learning , yaitu Naive Bayes Classifier (NBC). Akhir-akhir ini, dunia sains data dihebohkan dengan berbagai istilah statistik yang berkaitan erat dengan komputasi atau komputasi statistik, yaitu supervised learning dan unsupervised learning . Sebenarnya ada lagi istilah baru dan cukup makin sulit menyederhanakan definisinya, yaitu reinforcement learning , tapi khusus reinforcement learning nanti akan kita bahas tersendiri karena kita mulai bersinggungan dengan Artificial Intelligence atau kecerdasan buatan. Jujur, saya mengakui bahwa tidak semua dari kita memiliki latar belakang apalagi pakar teknologi informasi (IT). Sehingga, bila kita cermati bahasan-bahasan atau istilah komputasi statistik, sains data, atau data engineering , kita mungkin akan sejenak loading , bahkan s