Belajar Machine Learning via StackExchange

Salah satu yang menantang menurut saya untuk belajar Artificial Intelligence/Machine Learning/Data Mining adalah untuk belajar saja, kadang kita perlu menuliskan sintaks kode yang lumayan panjang dan kompleks. Mulai dari merapikan data, preprocessing, feature extraction, sampai proses utamanya sendiri. Kadang hal ini yang bikin jadi down dulu sebelum memulai belajar, apalagi bagi kita yang kesulitan meluangkan banyak waktu untuk sekadar latihan.

Nah, salah satu solusi belajar yang saya temui cukup membantu saya adalah dengan aktif di ruang diskusi yang membahas Machine Learning di internet. Salah satu forum diskusi yang cukup baik menurut saya adalah forum-forum terbitan StackExchange, seperti Stackoverflow, CrossValidated, atau AIStackExchange. Bagi kita programmer, saya yakin nama-nama itu bukanlah nama yang asing. Walau bukan benar-benar “forum diskusi” (situs StackExchange adalah situs tanya jawab atau QA site) situs-situs tersebut cukup baik untuk digunakan sebagai sarana belajar.

Salah satu sisi positif yang saya rasakan dari aktif di StackExchange kita bisa belajar dengan memperdalam logika dan teori dengan waktu yang relatif lebih singkat, tanpa harus membuat kode yang cukup panjang.

Note: aktif di forum hanyalah salah satu alternatif bagi teman-teman yang kesulitan meluangkan waktu banyak tapi tetap ingin belajar. Namun, bagi teman-teman yang ingin serius mendalami bidang ini, saya tetap sangat menyarankan untuk meluangkan waktu khusus untuk belajar untuk menyelesaikan kasus-kasus dan coding dari scratch.

Belajar Machine Learning via StackExchange

Ada beberapa cara bagi yang ingin belajar machine learning via stackexchange. Bisa dengan cara membaca-baca pertanyaan yang telah dijawab, aktif bertanya, ataupun aktif menjawab.

Belajar dari Pertanyaan Orang Lain

Cobalah mencari pertanyaan yang setopik dengan materi yang ingin kalian perlajari. Telusuri satu persatu pertanyaan yang sudah pernah ditanyakan, siapa tahu kalian menemukan pertanyaan atau jawaban yang menarik yang sebenarnya cukup penting untuk ditanyakan tapi kita tidak pernah terpikirkan.

Seperti pertanyaan yang baru-baru ini saya temui: kenapa kita menggunakan istilah “Machine Learning”, bukan “Program Learning” atau Bisakah kita menggunakan Neural Network untuk mendeteksi suatu bilangan ituย  prima atau bukan.

Dengan melihat jawaban orang lain kita juga jadi bisa menambah wawasan dengan menemukan solusi solusi menarik bagaimana orang menyelesaikan masalahnya.

Berani Bertanya

Tidak ada salahnya untuk bertanya asal dengan cara yang baik. Ada dua cara untuk kita bertanya di StackExchange, yang pertama kita bisa membuat pertanyaan baru, dan yang kedua adalah bertanya untuk meminta kejelasan jawaban via kolom komentar (ini butuh reputasi).

Untuk membuat pertanyaan baru, pastikan terlebih dahulu pertanyaan itu belum pernah ditanyakan sebelumnya. Untuk lebih yakin, cobalah googling kembali pertanyaan itu, atau bahkan lakukan parafrase jika perlu. Selain itu, pastikan juga kalian sudah membaca aturan singkat di halaman tour yang selalu ada di situs StackExchange manapun.

Contohnya di StackOverflow kalian akan mengenal istilah MVCE (Minimum Veriviable Complete Example), yakni sebuah aturan bagaimana memberikan contoh program kita yang eror secara minimalis. Secara tidak langsung, kita akan belajar bagaimana menjelaskan eror pada program kita secara baik kepada orang lain.

Note: Ingat, jika ingin mendapat jawaban yang baik, maka bertanyalah dengan cara baik.

Mencoba Memberi Jawaban

Selalu ada ilmu yang bisa kita bagi! Cobalah cari pertanyaan-pertanyaan sederhana yang sekiranya bisa kita jawab. Dengan mencoba menjawab beberapa pertanyaan, kita akan belajar untuk memahami lebih dalam materi yang kita pelajari. Kalau ada orang bilang, dengan mengajar ilmu kita bertambah, maka benar saja, dengan mencoba menjawab pertanyaan-pertanyaan di sana kita akan semakin bertambah wawasannya. Kita akan belajar bagaimana menjelaskan dan memberi contoh yang menjawab pertanyaan pengguna lain.

Takut di-downvote ๐Ÿ™

Ketika memberi jawaban atau pertanyaan, tentunya kita akan mendapat beragam feedback entah dari pengguna lain atau dari si-penanya. Mulai dari komentar, flag, atau downvote. Jangan minder jika ada feedback negatif, toh, namanya juga belajar dan diskusi ๐Ÿ™‚ Manusia tidak ada yang sempurna untuk luput dari kesalahan dan juga tidak semua manusia baik dan ramah untuk berdiskusi. Gunakan hal tersebut sebagai pengalaman untuk menjawab di kemudian hari.

Saya juga masih beberapa kali dapat komentar pedas atau “flag” pada pertanyaan saya karena tidak sesuai topik, tetapi bukan berarti lalu saya akan menghakimi forum tersebut tidak ramah dan melepas kesempatan saya belajar di sana.

Mulai Belajar!

Banyak pengalaman dan ilmu yang saya peroleh dengan aktif di StackExchange. Saya ingat bagaimana StackExchange telah membantu saya tidak hanya menyelesaikan skripsi saya, tetapi juga memahami lebih dalam tools yang saya gunakan. Selain itu semenjak aktif di StackExchange, saya juga merasa banyak terlatih untuk berkomunikasi dengan bahasa inggris secara natural. Jadi, Jangan ragu untuk memulai ๐Ÿ˜‰ Semoga Bermanfaat!

Sumber gambar: Pexels

Template Curriculum Vitae untuk LaTeX

Beberapa waktu lalu saya penasaran dengan tampilan Curriculum Vitae / CV/ Resume yang baik. Di internet ada banyak tampilan dengan beragam format, tapi kali ini saya tertarik untuk membuat CV dengan LaTeX.

Pilihan pertama saya jatuh pada CV buatan Thomas Jansson. Templatenya (file `resume.cls`) bisa didownload langsung di halaman aslinya atau di daftar template Sharelatex.

Tampilan akhir CV dengan template oleh Thomas Jansson

Jika kalian perhatikan, desainnya sudah sangat baik, elegan, dan terkesan profesional. Cocok untuk CV para profesional yang panjang ataupun para freshgraduate yang belum banyak pengalaman. Hanya saja ada yang kurang menurut saya, yakni warna. Template aslinya hanya menghasilkan CV berwarna hitam putih.

Note: Bagian selanjutnya dari artikel ini akan menjelaskan pengalaman saya mengedit template LaTeX untuk menambahkan theme color pada template CV. Jika ingin langsung menggunakan template yang telah saya edit sehigga dapat berwarna, silakan download file `resume.cls` di repository berikut.

Mengedit LaTeX template

Berdasarkan banyak tips dalam pemberian warna di CV maka saya berusaha untuk tidak terlalu banyak mewarnai area CV, hanya meng-highlight bagian-bagian yang saya rasa penting untuk diberi warna, yakni teks judul dan teks subjudul pada sisi samping.

Untuk mengedit LaTeX template, kita akan mengedit file `resume.cls` yang tadi telah kita download. Pertama-tama, tambahkan package yang menyediakan pewarnaan teks pada bagian akhir:

\usepackage[dvipsnames]{xcolor}

Saya berikan parameter tambahan `dvipsnames` sehingga kita memperoleh lebih banyak pilihan warna yang memiliki “nama” (jadi tidak perlu menginputkan kode heksadesimal).

Selanjutnya utuk mempermudah penggunaan warna, saya membuat variabel yang menyimpan warna menggunakan perintah `\colorlet`:

\colorlet{themecolor}{MidnightBlue}

Variabel `themecolor` adalah variabel yang akan kita gunakan untuk menyimpan warna template yang akan kita gunakan. Sedangkan `MidnightBlue` adalah warna tema yang saya gunakan untuk CV tersebut.

Note: Jika ingin mengganti warna template CV, ubah `MidnightBlue` menjadi warna lain sesuai selera

Selanjutnya kita cukup menyisipkan warna template kita ke bagian yang ingin kita beri warna, yakni judul dan subjudul di sisi samping. Di template, untuk mengedit kedua bagian tersebut kita dapat mengedit style yang digunakan, yakni `mysidestyle` dan `mytitle`.

\newcommand{\mysidestyle}[1]{\small\sc\textcolor{themecolor}{#1}}
\newcommand{\mytitle}[1]{{\sc\Large\textcolor{themecolor}{#1}}}

Jika diperhatikan, di sini untuk mewarnai text saya menggunakan perintah `textcolor{}`. Sebenarnya ada dua cara yang dapat digunakan yakni dengan `color{}` atau `textcolor{}`, tetapi cara pertama akan membuat eror pada template (text tidak lagi teralinea dengan rapi)

Setelah selesai, template `resume.cls` sudah akan dapat memberikan warna pada bagian-bagian yang kita tentukan. Jika sebelumnya sudah pernah menggunakan template dari Thomas Janssen, perubahan ini seharusnya tidak akan mengubah apapun kecuali pemberian warna.

Hasil template CV dengan warna tema MidnightBlue

featured image credit: https://www.philippewiget.com


Meng-custom Perintah/Command di Terminal Ubuntu

Beberapa waktu lalu saya mendapat kesempatan untuk ikut Grand Final Kode Indonesia di Jakarta. Kode Indonesia adalah sebuah kontes pemrograman yang diadakan oleh Kalibrr.

Berbeda dengan kontes pemrograman pada umumnya, pada kontes ini panitia tidak menyediakan komputer atau laptop untuk para finalis. Jadi para finalis dipersilakan untuk menggunakan komputernya masing-masing di Grand Final. Sebenarnya ini peraturan yang aneh karena ini membuat setiap peserta bisa jadi punya “starting-point” yang berbeda kan? misal kualitas komputer, file-file yang tersedia, dsb.

Tapi ya sudah, karena ini aturan panitia sendiri maka saya juga mencoba menyiapkan laptop saya. Hal sederhana yang saya pikirkan adalah:

Meng-custom perintah atau command di terminal Ubuntu: Coba buat perintah sederhana untuk meng-compile sekaligus menjalankan program C++!

Tujuan command tersebut tentu untuk mempersingkat proses compile. Karena saya sendiri biasa tidak menggunakan IDE yang bisa meng-compile program, maka cara saya biasanya untuk meng-compile file C++ adalah dengan menjalankan perintah (command) berikut:

$ g++ mycppfile.cpp -o outfile

Lalu setelah di-compile, dijalankan dengan perintah:

./outfile

Nah, misi sederhana saya saat itu adalah menyederhanakan kedua perintah di atas menjadi sebuah perintah sederhana. Setelah browsing-browsing, berikut ini rangkuman langkah-langkahnya:

  1. Buat sebuah script file, misalnya kita beri nama `customcpp.sh`
  2. Pada baris pertama, tuliskan `#!/bin/bash` lalu tuliskan perintah yang ingin dijalankan di bawahnya seperti di bawah. Pada perintah di bawah `CPPFILE` adalah variabel yang menyimpan argumen yang akan diinputkan saat pemanggilan. Nantinya akan menerima nama file yang akan di-compile.
    #!/bin/bash
    CPPFILE="$1"
    g++ ${CPPFILE}.cpp -o outfile
    ./outfile
  3. Simpan file tersebut, lalu pindahkan ke `/usr/local/bin`, pemindahannya bisa menggunakan command di bawah. SCRIPTNAME adalah nama perintah yang akan dipanggil ketika script di atas di jalankan.
    sudo mv ~/customcpp.sh /usr/local/bin/SCRIPTNAME
  4. Atur permission agar program bisa diakses
    sudo chown root: /usr/local/bin/SCRIPTNAME
    sudo chmod 755 /usr/local/bin/SCRIPTNAME

Dan… selesai!

Setelah selesai, sekarang untuk mengcompile sekaligus menjalankan program C++, saya cukup mengetikkan di terminal command berikut ini:

SCRIPTNAME mycppfile

ya.. setidaknya sedikit lebih cepat dari sebelumnya kan ๐Ÿ˜‰

Sumber:

Parser Kalimat Sederhana untuk Bahasa Indonesia

Beberapa waktu lalu saya mendapat tugas kerja untuk membuat sebuah text summarizer (perangkum bacaan) menjadi sebuah kalimat sederhana. Istri saya yang lebih mendalami bidang NLP menyarankan untuk menggunakan teknik yang sederhana:

Temukan kalimat utama, dan jadikan kalimat tersebut sebagai rangkuman.

Saya setuju ide itu, selain tidak serumit jika mengunakan machine learning yang kompleks, rasanya cara itu sudah cukup cocok untuk kasus saya. Istri saya memberi tahu saya beberapa algoritma yang bisa digunakan dan sebuah peringatan bahwa bagian paling sulit adalah nanti bagaimana membuat parser kalimat (program yang dapat mengekstrak kalimat-kalimat yang menyusuk sebuah dokumen teks).

Saya buat parser ini menggunakan bahasa pemrograman Python, dengan bantuan beberapa package (`re` untuk regex, dsb.).

Split berdasar penanda akhir kalimat

Percobaan pertama yang saya lakukan adalah menggunakan regex untuk men-split data teks berdasarkan beberapa karakter yang biasa menjadi penanda akhir dari sebuah kalimat. Karakter pemisah yang saya gunakan awalanya aadalah tanda titik (“.”), tanda tanya (“?”), dan tanda seru (“!”) yang setelahnya terdapat sebuah spasi atau sudah di akhir dokumen.

newtext = re.split("[\.\!\?][ $]", text)

Setelah coba dijalankan, saya menemukan beberapa fakta menarik. Pertama, seharusnya saya tidak perlu memisahkan berdasarkan tanda tanya dan tanda seru karena kedua tanda tersebut hanya muncul di kalimat langsung yang tidak perlu di split. Jadi berikutnya kita cukup split di tanda titik.

newtext = re.split("\.[ $]", text)

Kedua, asumsi saya menggunakan tambahan “sebuah spasi setelah karakter” ternyata benar-benar bermanfaat karena parser akhirnya tidak men-split tanda titik yang bukan akhir kalimat, misalnya `6.700 korban`.

Kalimat langsung

“Roses are red. Violets are Blue,” said Hugo.

Dalam kasus saya, kalimat di dalam kalimat langsung tidak boleh dipisah. Untuk menghindari pemisahan, perlu dibuat aturan khusus (saya rasa ini bisa di-handle menggunakan regex). Ide saya sementara ini dengan membuat variabel untuk mengecek sebuah simbol pemisah ada di dalam double quote atau tidak, lalu jika tanda titik misalnya ada di antara double quote, maka kita beri “tanda” agar tidak di split.

inside = False
for i in range(len(text)):
    if text[i]=="\"":
        inside = not inside
    if inside and text[i]==".":
        # mark to not split here

“Tanda” agar tidak di-split

Untuk menandai sebuah simbol tidak boleh di split, saya sisipkan simbol yang unik (yang saya yakin tidak akan muncul di dokumen saya) sebelum dan setelah tanda titik. Saya gunakan simbol `@#…@#`.

“Roses are red@#.@# Violets are Blue,” said Hugo.

Mengatasi Singkatan

Ini adalah bagian yang juga sulit, misalnya ada kalimat:

Tadi malam saya bertemu H. Akbar M. dan drs. Rian. Kami adalah sahabat dekat dulunya.

Jika diperhatikan tanda titik setelah huruf “H” dan huruf “M”, bukanlah tanda akhir dari kalimat, begitu juga tanda titik setelah “drs”. Tanda titik yang digunakan untuk memisah kalimat adalah setelah kata “Rian”.

Awalnya saya berpikir untuk tidak mensplit tanda titik yang sebelumnya hanya satu huruf, tapi “drs” lebih dari satu huruf dan juga merupakan singkatan. Kita harus menemukan sebuah kata adalah singkatan atau bukan.

Deteksi singkatan

Pada projek ini ada dua aturan yang gunakan:

  1. Jika kata sebelum tanda titik hanya terdiri dari satu huruf, maka itu adalah singkatan. Contoh: “M.”, “H.”
  2. Jika tidak, maka cek terlebih dahulu di kamus singkatan (saya buat sendiri), jika ditemukan, maka kata tersebut singkatan. Contoh: “Prof.”, “Dr.”, “Hj.”, “dll.”, “Moch.”

Secara tidak langsung, aturan ini juga menangani singkatan panjang seperti “S.W.A.T.”. Setelah berhasil mendeteksi singkatan, dengan ide yang sama kita kasih “tanda” pada tanda titiknya, lalu split dengan fungsi regex seperti sebelumnya.

Hapus “tanda”

Setelah berhasil split kalimat, jangan lupa untuk menghilangkan simbol yang tadi kita gunakan sebagai “tanda”. Caranya bisa dengan manual seach atau dengan regex.

Program

Program bisa diakses di Google Colab berikut

Image from: https://museafrica.com

Menuliskan Huruf Arab di Latex

Catatan: Artikel ini khusus untuk pengguna template Latex MIPA UGM SKRIPSI

Jadi ketika saya menulis skripsi dan tesis beberapa waktu lalu saya perlu menuliskan beberapa huruf Arab di laporan saya. Saya menggunakan template Latex dari MIPA UGM (download di sini).

Template tersebut dibuat awalnya oleh Pak Drs. Pekik Nurwantoro, Ph.D. lalu dimodifikasi oleh teman saya, Yusuf Syaifudin. Dan saya modif lagi di repo github saya. Dan karena menggunakan template ini lah menulis huruf Arab jadi sedikit tricky dari biasanya.

Compiler

Problem pertama adalah selama ini saya meng-compile file Latex saya menggunakan perintah pdflatex yang ternyata bisa dibilang tidak support untuk menampilkan tulisan dengan huruf yang aneh-aneh (unicode). Karenanya salah satu opsi yang saya gunakan adalah pindah menggunakan xelatex.

Compiler ini sebenarnya tidak perlu diinstall lagi bagi pengguna texlive Ubuntu. Dan kalau di online editor, biasanya juga disediakan opsi untuk mengatur compiler yang digunakan.

Package

Masalah lain adalah template dari MIPA UGM sudah tertata rapi, ini membuatnya sulit untuk sekadar menambah pengaturan package agar bisa menuliskan huruf Arab tanpa merusak apapun. Saya sudah mencoba menggunakan babel atau polyglossia tetapi selalu berakhir compiler error ๐Ÿ™

Lalu bagaimana solusinya? setelah beberapa kali mencoba solusi, saya temukan solusi yang menurut saya paling pas, berikut langkah-langkahnya:

1. Install XeTeX kalau anda belum memiliki xelatex. Di buntu bisa menggunakan perintah:

sudo apt-get install texlive-xetex

2. Download font yang menyediakan tampilan huruf Arab. Misalnya, yang saya gunakan adalah font Scheherazade.

3. Definisikan font tersebut ke dokumen kalian (di template MIPA UGM perinah ini dituliskan di ADDITIONAL_PACKAGE.tex)

 usepackage{fontspec}
 \newfontfamily\arabicfont[Script=Arabic]{Scheherazade}

4. Selanjutnya untuk setiap akan menuliskan huruf Arab, tinggal gunakan perintah \arabicfont:

This is english document {\arabicfont ูˆูŽู‡ูŽุฐูู‡ู ููู‚ุฑูŽุฉูŒ ุจูุงู„ุนูŽุฑูŽุจููŠูŽุฉ ู…ูŽุนูŽ ูƒูŽู„ูู…ูŽุฉ
ุงูู†ูƒู„ููŠุฒููŠูŽุฉ } and this is also english text.

5. Lalu untuk meng-compile, kita gunakan Xelatex, dengan perintah

xelatex yourdoc.tex

6. Ketika proses compile selesai, maka akan muncul huruf Arab yang di posisi yang diinginkan. Tapi coba perhatikan, ada yang aneh dengan tulisan tersebut, yakni tulisan tidak dalam format RTL (right to left), atau tertulis dari kanan ke kiri, sehingga tulisannya jadi terbaca aneh. Lalu bagaimana caranya membuatnya format RTL?

7. Download file bidi.tex dari texdoc.net/texmf-dist/tex/xelatex/bidi/bidi.tex, jangan gunakan package bidi menggunakan perintah \usepackage{bidi} Saya tidak tahu pasti kenapa, tapi menggunakan package bidi seperti itu akan merusak template MIPA UGM. Dengan menggunakan bidi.tex langsung dari filenya kita memperoleh versi sederhana dari bidi yang lebih aman.

8. Inputkan file bidi tersebut setelah kita definisikan huruf Arab kita:

\usepackage{fontspec}
\newfontfamily\arabicfont[Script=Arabic]{Scheherazade}
\input{bidi.tex}

9. Untuk mengaktifkan RTL gunakan perintah \RL:

This is english document \RL{\arabicfont ูˆูŽู‡ูŽุฐูู‡ู ููู‚ุฑูŽุฉูŒ ุจูุงู„ุนูŽุฑูŽุจููŠูŽุฉ ู…ูŽุนูŽ ูƒูŽู„ูู…ูŽุฉ
ุงูู†ูƒู„ููŠุฒููŠูŽุฉ } and this is the other english text.

10. Dan coba compile ulang, maka kali ini akan benar-benar berhasil:

Sekian! Semoga bermanfaat, jika ada yang ditanyakan atau ada usulan solusi lain silakan komentar di kolom yang tersedia! ๐Ÿ™‚

Sumber: