Part of Speech Tagger dan Dependency Parser Bahasa Indonesia: Syntaxnet

4 March 2017 at 14:42 | Posted in bahasa indonesia, penelitian, text processing | 6 Comments

Fungsi POS Tagger adalah memberi label jenis kata (kata benda, kata kerja dst), sedangkan dependency parser berfungsi mencari struktur tata bahasa seperti subyek, obyek dan keterkaitan antar kata (parent dan child yang bergantung pada parent).  POS tagger dan dependency parser berguna untuk banyak task NLP.

POS Tagger bahasa Indonesia masih belum banyak dan kalaupun ada lisensinya masih kurang jelas. Saya hanya menemukan dua, yang pertama dari UI http://bahasa.cs.ui.ac.id/postag/tagger  dengan lisensi creative commons (agak aneh karena setahu saya creative commons bukan untuk source code) dan lainnya INANLP dari ITB tetapi tidak tersedia bebas source code-nya (cmiiw). Lisensi ini jadi penting jika kita ingin membuat software yang komersial. Untuk dependency parser Bahasa Indonesia saya belum menemukannya.

Saat saya mempelajari Tensorflow, saya melihat library Syntaxnet yang menggunakan Tensorflow untuk POS Tagger dan dependency parser, dan ternyata sudah ada parser untuk Bahasa Indonesia. Sudah ada pretrained model  sehingga tidak perlu lagi mencari data dan melakukan training lagi. Lisensinya juga Apache 2.0 yang sangat longgar. Berikut proses instalasinya.

Pertama siapkan Linux dan install Tensorflow, terutama yang penting bagian persiapan terkait software pendukung GPU-nya (posting saya tentang menginstall tensorflow). Mungkin sebenarnya setelah persiapan  GPU, bisa saja langsung install Syntaxnet karena syntaxnet mengcompile ulang source, tapi untuk amannya, install saja keseluruhan Tensorflow.  Selanjutnya  ikuti petunjuk instalasi Syntaxnet  yang ada di: https://github.com/tensorflow/models/tree/master/syntaxnet#installation

Prosesnya cukup lama (2-3 jam)untuk menginstall Syntaxnet ini dari source code, termasuk mencompile core tensorflow lagi. Padahal saya sudah menginstall tensorflow sebelumnya. Lalu ada beberapa peringatan tentang SS3, AVX dst,  yang saya tidak tahu harus diset dimana. Waktu install Tensorflow sebelumnya, warning tersebut hilang setelah saya intsall dari source bukan binary.

Untuk mencoba  apakah instalasi berhasil, masuk ke direktori /models/syntaxnet lalu jalankan:

echo 'Rudi is eating the rice.' | sudo sh syntaxnet/demo.sh
Hasilnya:
+-- Rudi NNP nsubj
 +-- is VBZ aux
 +-- rice NN dobj
 | +-- the DT det
 +-- . . punct

Berikutnya kita akan meload pretrained untuk bahasa Indonesia, penjelasannya ada di:

https://github.com/tensorflow/models/blob/master/syntaxnet/g3doc/universal.md

Download model Bahasa Indonesia di:

http://download.tensorflow.org/models/parsey_universal/Indonesian.zip

Ekstrak  zip tersebut (kalau saya ekstrak di /models)

Untuk menjalankan parser, masuk ke direktori syntaxnet, lalu masukan perintah. Pastikan tidak ada slash setelah direktori model bahasa Indonesia ( ~/models/Indonesian bukan ~/models/Indonesian/ )

echo 'Budi makan nasi enak sekali' | sudo sh syntaxnet/models/parsey_universal/parse.sh ~/models/Indonesian

Maka hasilnya

1 Budi _ PROPN _ fPOS=PROPN++ 2 nsubj _ _
2 makan _ VERB _ fPOS=VERB++ 0 ROOT _ _
3 nasi _ NOUN _ fPOS=NOUN++ 2 dobj _ _
4 enak _ ADJ _ fPOS=ADJ++ 3 amod _ _
5 sekali _ ADV _ fPOS=ADV++ 4 advmod _

PROPN adalah proper noun, ADJ adalah adjective dst.

Sedangkan hasil dependency parser dapat dibaca: “makan” adalah ROOT dengan parent 0, “Budi” adalah subyek (nsubj) dengan parent no 2 (“makan”) dst.  Jika digambarkan dependency treenya adalah sbb.

budi_makan_nasi

Advertisements

Mencoba Tensorflow

26 February 2017 at 16:58 | Posted in penelitian | Leave a comment

Bagi yang pemula yang ingin menginstall tensorflow dengan gampang, ini tutorial yang saya buat: http://yudiwibisono.staf.upi.edu/2017/06/03/install-ubuntutensorflowkeras/

Update Mei 2017:

Akhirnya beli PC sendiri, niatnya akhir pekan digunakan oleh anak untuk main game, sisanya untuk saya eksperimen 🙂 GTX1060 6GB, memori 32GB, core i7 6700.  Sebenarnya lebih ideal GTX1070 yang 8GB atau 1080, tapi harganya hampir dua kali lipat dari 1060.  Sempat bermasalah saat install karena chipset tidak dikenali dan menyebabkan monitor blank (tip: edit grub.cfg, tambahkan opsi nomodeset).  Lalu setelah diinstall Ubuntu eh terus nyelonong ke Windows 10 (Grub tidak dipanggil). Bisa diperbaiki dengan boot-repair lalu grub update.  Terakhir ternyata ukuran partisi swap yang dibuat 32GB!  padahal saya cuma beri ukuran 50GB untuk Ubuntu karena ukuran HD SSD terbatas. Ini ternyata gampang diatur ulang dengan GParted. Lumayan repot untuk saya yang awam Linux.

Untuk pengingat masalah saat install Tensorflow:

  • Saat install Cuda Toolkit, gunakan versi deb jangan local file. Jika menggunakan local file efeknya harus matikan x-server dst yang lebih ribet.
  • Cara update driver GPU NVIDIA yang lebih mudah di Ubuntu adalah dengan masuk System Setting ; Software and Updates ; tab Additional Driver lalu pilih NVDIA binary driver. Tidak perlu dengan apt-get install nvidia-375 lagi.
  • Terbentur saat install CuDNN lagi 😦  kurang jelas ternyata posting blog ini.  Jadi di situs cuDNN saat pilih CuDNN versi 5.1, ada tiga file yang perlu di download: cuDNN v5.1 Library for Linux,  cuDNN v5.1 Runtime Library for Ubuntu14.04 (Deb), cuDNN v5.1 Developer Library for Ubuntu14.04 (Deb). Hati-hati jangan pilih yang Power 8, walaupun untuk Ubuntu 16.04 tapi arsitekturnya berbeda (bukan arm64).  Untuk file library for linux, formatnya .tar, ekstrak lalu berdasarkan direktorinya copy ke /usr/local/cuda-8.0/include dan /usr/local/cuda-8.0/lib64. Gunakan sudo cp -P agar symlinknya ikut tercopy(?).  Untuk runtime lib dan dev lib formatnya .deb, install dengan dpkg. Mungkin ini dapat dipilih salah satu? atau bahkan mungkin malah tidak perlu? Nanti kapan-kapan saya coba deh.

–end update–

Catatan: update ini tdk berlaku lagi, lihat update Mei di atas.

Update Mar 2017: karena di lab ada PC dengan GPU GTX980, maka saya mencoba untuk menginstall Tensorflow dengan GPU.  Perlu beberapa kali baru berhasil. Kesalahan pertama, saya belum update driver GPU dengan yang versi terakhir (375) agar bisa jalan dengan Cuda8. Cara update driver, masuk mode tty (ctrl-alt-F1)  lalu:

  1. Run sudo apt-get purge nvidia-*  
  2. Run sudo add-apt-repository ppa:graphics-drivers/ppa lalu sudo apt-get update.
  3. Run sudo apt-get install nvidia-375.

Sumber: http://askubuntu.com/questions/760934/graphics-issues-after-while-installing-ubuntu-16-04-16-10-with-nvidia-graphics 

Tadinya saya coba menggunkan installer dari web NVIDIA dan gagal total.

Kesalahan kedua: saat instal CudaDNN (lib cuda untuk neural net), tadinya saya ikuti petunjuk yang ada di situs Tensorflow, dan gagal. Ternyata yang harus dilakukan adalah mendownload versi linux (tar) dan versi ubuntu (deb). Lalu ekstrak ke lokasi cuda diinstall di dalam /header dan /lib64   (baca http://askubuntu.com/questions/767269/how-can-i-install-cudnn-on-ubuntu-16-04/767270)

— end update —

Tensorflow adalah library untuk deep learning (neural net dengan banyak layer dan bermacam topologi) yang dikembangkan Google dan dijadikan open source. Saya tertarik mencoba Tensorflow karena memerlukan library sequence to sequence untuk di NLP. Library buatan perusahaan besar seperti Google enaknya adalah dokumentasi lengkap, fitur lengkap dan kalau ada bug cepat ditangani (yang mengerjakannya pegawai yang digaji, bukan proyek sampingan sih 🙂 )

Walaupun bisa diinstall di  Windows, Tensorflow dari awal ditujukan untuk Unix. Karena pernah punya pengalaman jelek install Python di Windows, maka saya akan coba di Linux. Idealnya sih menyiapkan komputer yang punya GPU bagus dengan OS Linux,  tapi karena saya masih menggunakan Windows, maka saya menggunakan VMWare + Ubuntu saja.

Petunjuk instalasi lengkap dan mudah untuk diikuti (saya termasuk awam Linux). Saya coba berhasil tapi lalu bermunculan berbagai warning:

The TensorFlow library wasn’t compiled to use SSE3 instructions, but these are available on your machine and could speed up CPU computations.

The TensorFlow library wasn’t compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations … dst

Setelah saya baca, warning ini bisa dihilangkan dengan cara menginstall lansung dari source dan bisa mempercepat sampai tiga kali lipat. Saya kemudian coba install dari source, tidak ada masalah, hanya lumayan lama saat build. Lalu sempat kebingunan cari bazel-bin, ternyata ada di dalam direktori tensorflownya dan pada saat pip install, nama file whl-nya tidak sama persis dengan tutorial, bergantung pada konfigurasi yang kita tentukan.  Nanti tulisan ini akan saya lanjutkan sejalan dengan eksplorasi  Tensorflow ini 🙂

Untuk editor Python, saya sempat cari-cari, dan ternyata JetBrains punya editor PyCharm. Bagi saya yang sudah terbiasa dengan produk JetBrains Android Studio dan IntelliJ, tentu lebih nyaman menggunakan PyCharm ini.

  • Setelah lancar di contoh-contoh awal, akhirnya kena error saat menjalankan contoh tf.contrib.learn, beberapa warning tepatnya, tapi hasilnya tidak muncul. “WARNING:tensorflow:Rank of input Tensor (1) should be the same as output_rank (2) for column. …. WARNING:tensorflow:From ….; scalar_summary (from tensorflow.python.ops.logging_ops) is deprecated  …  Update: hasilnya muncul, harus tambahkan print ternyata. Cuma warning tetap keluar, tidak tahu kenapa.
  • Ternyata saat menggunakan GPU, maka yang digunakan memori GPU bukan CPU. GTX980 yang punya memori 4GB ternyata pas-pasan. Perlu dipikirkan upgrade ke GTX1080 atau minimal GTX1060 . Salah pesan kemarin, harusnya memori PC tidak perlu terlalu besar, yang penting GPU-nya sebaik mungkin. Update: ternyata penggunaan memori saat training (task machine translation) sampai 25GB, artinya memori 32GB berguna juga. CPU usage tidak terlalu tinggi. Load avg 1.5 untuk 6 cores artinya hanya sekitar sepertiga CPU yang digunakan.

Social Network Analysis berdasarkan Reply Tweet Artis

27 February 2012 at 19:42 | Posted in penelitian, text processing, twitter | 10 Comments

Hari  ini saya mencoba library nodexl (nodexl.codeplex.com) sekaligus  mengeksplorasi tweet  para artis yang telah saya kumpulkan mulai awal Feb 2012.  Tweet artis dipilih  karena mereka  sudah terbiasa diliput publik sehingga diasumsikan  lebih menerima  jika  dieksplorasi datanya — semoga 🙂 .  Alasan lain adalah tweet mereka banyak direspon dan  sudah dikenal masyarakat.

Visualisasi social network bertujuan menggambarkan hubungan antar unit.   Untuk Twitter, hubungan antar account dapat berbentuk banyak hal, mulai dari hubungan follower/friend (paling populer), retweet, favourite, mention, reply dan sebagainya.    Untuk kesempatan ini saya akan menggunakan hubungan reply yang memperlihatkan adanya komunikasi atau pembicaraan antara dua account.  Asumsi saya (perlu pembuktian nanti), reply dan mention adalah hubungan kuat antara dua account twitter. Retweet atau favourite bisa dilakukan dengan satu tombol dengan mudah, tapi untuk me-reply pengguna harus mengetikkan sesuatu.

Berikut adalah visualisasinya, semakin tebal garis berarti semakin banyak si-artis me-reply. Minimal ada tiga jumlah reply, kurang dari itu tidak digambarkan. Titik biru adalah artis (diambil 100 artis dengan follower terbesar), titik hitam adalah account Twitter lain. Data yang digunakan adalah tweet dari tanggal 1 Feb sampai dengan 21 Feb 2012.  Klik gambar lalu zoom  kalau masih tidak jelas.

Soc. Network Artis berdasarkan reply

Catatan yang perlu diingat sebelum dibaca lebih lanjut:   (1) artis dalam artikel ini  didefinisikan sebagai  100 artis dengan follower  tertinggi. (2) tweet yang digunakan berada dalam periode satu bulan sehingga  bisa jadi hubungan yang ada  bersifat  sementara. (3) tentu ada media lain yang digunakan selain melalui tweet, misalnya SMS, DM, FB, email, BBM, messenger dsb yang  tentunya tidak tertangkap dalam visualiasi ini.

Beberapa hal menarik dari  visualiasi di atas:

  • Dua account yang paling sering menggunakan reply adalah @ti2DJ dan @erdiAN_aJI.  Jumlah reply terbesar dipegang  oleh @ti2DJ dengan 26 reply ke sebuah account (anaknya?).  Ini menunjukkan kedua artis ini aktif  menggunakan  twitter sebagai media  komunikasi dua arah atau lebih.
  • Di sisi lain, tidak semua account menggunakan Twitter untuk komunikasi, atau kalaupun ada hanya terbatas ke beberapa orang saja.  Mungkin mereka  lebih memilih menggunakan DM,  SMS atau  messenger? Lagipula dengan jumlah follower besar, wajar kalau mereka lebih berhati-hati.   Sebagai contoh @aqi_alexa hanya terhubung dengan 3 orang, dengan yang terkuat adalah @aud33y (istri).
  • Dari sisi reply via tweet, hubungan antar sesama artis ternyata tidak terlalu dekat.  Kecuali @ti2DJ yang terhubung dengan 8 artis,  artis lain tidak terlihat atau hanya sedikit  terhubung dengan sesama artis.  Ada beberapa yang justru terhubung kuat  dengan ‘orang biasa’  (bukan teman dan memiliki follower sedikit)  yang tidak terkait dengan bidang keartisan.  Informasi ini dapat  digunakan untuk melihat hal yang sedang diminati oleh  artis tersebut.
  • Account @dahsyatnyaolga dan @jess_iskandar sepertinya  artis yang paling  punya hubungan yang kuat dengan  penggemar fanatik. Misalnya dengan @salvia_cumaOLGA, @Icha_LoveOlga, @EmiLiaCyankOLGA dan lainnya.

Setelah mencoba-coba nodeXL dan data artis ini selama satu hari,  berikut adalah beberapa hal yang saya peroleh:

  • Kekuatan NodeXL adalah mudah dipelajari dan  mudah digunakan karena berbasis Excel.  Powerfull kalau dikombinasikan dengan SQL (jalankan query di HeidiSQL, copy paste hasilnya ke NodeXL) .  Tapi masih terlalu rumit untuk diserahkan ke enduser, dan hanya jalan di Windows (non web). Gambar yang dihasilkan juga masih harus digeser-geser manual supaya lebih jelas.
  • Menarik kalau ditambahkan content analysis dari komunikasi antara account.  Idealnya  garis yang menghubungkan dua account  saat diklik dapat menampilkan rangkuman pembicaraan (keywords), sentimennya, dan juga dapat di drill down sampai  ke  tweet mentah.
  • Perlu aspek temporal. Bagaimana kekuatan hubungan dua account dari waktu ke waktu?  Mungkin ada yang menguat (menebal kalau di gambar) saat mengerjakan proyek bersama, mungkin ada juga yang tiba-tiba dari kuat lalu menghilang  (putus/bertengkar).  Akan bagus  kalau untuk satu account dapat di-play selama 1 tahun misalnya sehingga terlihat  pergerakan hubungannya dengan account lain.
  • Perlu tools untuk melihat sekilas isi sebuah account. Saat ini langkah manual yang saya lakukan adalah: melihat garis yang tebal yang menandakan hubungan yang kuat. Lalu  lihat siapa,  copy-paste di Twitter untuk dicari, lihat deskrpsi dan tweet orang tersebut, dan googling jika diperlkukanuntuk menentukan kira-kira dia siapa.  Akan lebih enak kalau ada tools yang membantu semua proses itu. Yap saya memang pemalas 🙂

Data yang dianalisis pada posting ini adalah  tweet para artis. Selain data ini, saya juga mengumpulkan tweet dari orang lain yang berkaitan dengan artis (mention).  Jumlahnya  tentu lebih besar, mungkin lebih menarik lagi nanti hasil analisisnya.

Pengguna Twitter Indonesia dengan Follower Terbanyak

4 January 2012 at 16:29 | Posted in penelitian, text processing, twitter | 12 Comments

Update: 27 Feb 2012, analisis keterkaitan account artis berdasarkan reply ada di posting ini

Beberapa hari ini saya mulai mengumpulkan secara otomatis data mengenai pengguna Twitter, khususnya pengguna dari Indonesia.   Tentunya ini data sementara dan mungkin saja ada yang terlewat, nanti akan diupdate sejalan dengan makin lengkapnya data.

Besarnya follower memang belum tentu berbanding lurus dengan kemampuan mempengaruhi (influence),  tapi tetap merupakan modal penting. Rencana kedepan adalah menganalisis secara lebih mendalam  hubungan antar account berdasarkan content (tweet).

Berikut adalah 50 account Twitter dengan follower terbanyak (data Januari 2012).  Tiga teratas adalah Sherina Munaf,  Agnes Monica dan detik.com.  Menarik adalah account non personal seperti @tweetramalan, @pepatah  yang bisa masuk ke 10 besar.  Satu atlit yang masuk ke 10 besar adalah Irfan Bachdim.

User Name

Nama

followers_count

@sherinamunaf Sherina Munaf

2370152

@agnezmo Agnes Monica

2010853

@detikcom detikcom

1664032

@vidialdiano Vidi Aldiano

1659567

@TweetRAMALAN Ramalan Indonesia

1642051

@radityadika raditya dika

1624734

@Poconggg ariefmuhammad

1579399

@pepatah Denny Ch Pratama

1574060

@IrfanBachdim10 Irfan Bachdim

1499464

@afgansyah_reza afgansyah reza

1425980

@bepe20 •Bambang Pamungkas•

1389649

@sule_prikitw sule_prikitiew

1365260

@cinema21 cinema21

1273892

@Metro_TV METRO TV

1244616

@LunaMaya26 luna maya

1243724

@shireensungkar shireen sungkar

1162978

@olla_ramlan ollaramlan

1122601

@SoalCINTA Denny JA_soalCINTA

1008854

@MarioTeguhWord Mario Teguh Quotes

993259

@MotivatorSuper Motivator Super

989393

@indrabektiasli bekti indratomo

970274

@nikita_willy nikita purnama willy

874585

@desta80s Deddy Mahendra Desta

842057

@kompasdotcom KOMPAS.com

833448

@KamusCewek Kamus Cewek

803361

@bismakarisma Bisma Karisma ?

752099

@tvOneNews tvOne WebNews

726320

@OVJ_Trans7 OVJ Trans 7

710756

@TweetKlik Tweet Klik

690740

@TheHitsTransTV The Hits

676947

@indraherlambang indra herlambang

675835

@AdrieSubono Adrie Subono

673247

@morganoey Morgan Oey

642491

@sarseh sarah sechan

622100

@indybarends indy barends

620848

@thalitalatief thalitalatief

615722

@gadiiing Gading Marten

600416

@tantrikotak tantri syalindri

596977

@FaktanyaAdalah Faktanya ?dalah™

580527

@widikidiw ™ |?\??????/??|?

580489

Sedangkan untuk  200 teratas, komposisi jenis pengguna twitter adalah sebagai berikut.  Terlihat bahwa account yang mendominasi adalah   account yang berkaitan dengan dunia hiburan dan  kalimat-kalimat motivasi, joke, kata mutiara.

Jenis

Jumlah

Pepatah/kata mutiara/joke

53

Penyanyi

30

Artis/Aktor

30

Presenter/Host

21

Acara TV

9

Pelawak

8

Atlit

7

Berita

7

Penulis

4

Perusahaan

4

Pemerintah

3

Pemusik

3

sutradara/produser film

2

Produk

2

Dokter

2

Entertaint lainnya

2

Situs non berita (kaskus etc)

2

Motivator

1

Pengusaha

1

Pengusaha

1

Fans

1

Penari

1

Politikus

1

Tempat/Lokasi

1

Seniman

1

Model

1

Berikut adalah rincian siapa saja yang masuk 10 besar  untuk 5  kategori teratas

Kategori: kata mutiara/pepatah/joke

Twitter ID

Nama

followers_count

@TweetRAMALAN Ramalan Indonesia

1642051

@pepatah Denny Ch Pratama

1574060

@SoalCINTA Denny JA_soalCINTA

1008854

@MarioTeguhWord Mario Teguh Quotes

993259

@MotivatorSuper Motivator Super

989393

@KamusCewek Kamus Cewek

803361

@TweetKlik Tweet Klik

690740

@FaktanyaAdalah Faktanya ?dalah™

580527

@pemulihanjiwa Hatiku Tenang

533635

@NasihatSahabat Kata Bijak & Nasihat

523662

Kategori: Penyanyi

Twitter ID

Nama

followers_count

@sherinamunaf Sherina Munaf

2370152

@agnezmo Agnes Monica

2010853

@vidialdiano Vidi Aldiano

1659567

@afgansyah_reza afgansyah reza

1425980

@bismakarisma Bisma Karisma ?

752099

@morganoey Morgan Oey

642491

@tantrikotak tantri syalindri

596977

@widikidiw ™ |?\??????/??|?

580489

@armandmaulana armand maulana

539236

@rafaell_16 Rafael Tan

491466

Kategori: Artis/Aktor

Twitter ID

Nama

followers_count

@LunaMaya26 luna maya

1243724

@shireensungkar shireen sungkar

1162978

@nikita_willy nikita purnama willy

874585

@SandraDewi88 Sandra Dewi

566592

@t_ORASUDI_ro tora sudiro

523023

@Bellaudya829 Laudya cynthia bella

404641

@CUTTARYtweet Cut Tary

393496

@juliaperrez JULIAPEREZ / JUPE

382042

@chelseaolivia92 Chelsea Olivia

350585

@WulanGuritno Wulan Guritno

337107

Kategori: Presenter / Host

Twitter ID

Nama

followers_count

@indrabektiasli bekti indratomo

970274

@desta80s Deddy Mahendra Desta

842057

@indraherlambang indra herlambang

675835

@sarseh sarah sechan

622100

@indybarends indy barends

620848

@thalitalatief thalitalatief

615722

@gadiiing Gading Marten

600416

@vincentrompies vincent ryan rompies

554440

@omeshomesh ananda omesh

398730

@dahsyatnyaolga Olga Syahputra

359914

Kategori: Acara TV non berita.

Terlihat TransTV adalah perusahaan TV yang paling sukses dengan menempatkan 6  acaranya pada 10 besar.

Twitter ID

Nama

followers_count

@OVJ_Trans7 OVJ Trans 7

710756

@TheHitsTransTV The Hits

676947

@dahSyatMusik dahSyat

555197

@onlinetranstv online transtv

448699

@inserttranstv informasi selebriti

388146

@InboxSCTV_ Inbox SCTV

336829

@KickAndyShow Kick Andy Show

306330

@DeRingSTransTV Derings Trans TV

184215

@cintacenatcenut Cinta Cenat Cenut II

169110

Analisis Tweet: Opini atau Sentimen

26 December 2011 at 19:49 | Posted in penelitian, text processing, twitter | 36 Comments

Twitter seringkali digunakan untuk ‘curhat’ mengenai sesuatu hal, baik memuji ataupun mencela. Tentunya ini punya potensi besar bagi perusahaan yang ingin mengetahui feedback masyarakat untuk merk dan layanan mereka demikian juga  partai politik atau politikus yang ingin mengukur tingkat popularitas mereka. Analisa ‘curhat’ ini dikenal dalam dunia pemrosesan teks sebagai analisa opini atau sentimen (opinion analysis atau sentiment analysis). Opini artinya adalah pandangan subyektif seseorang tentang suatu hal.

Ada beberapa task utama dalam analisis opini, diantaranya:

  1.  Menentukan tweet berisi opini atau tidak. Contoh bukan opini: “Hari ini saya belanja di supermarket X”. Sedangkan contoh opini adalah “Pelayanan kasir supermarket X tidak ramah dan lambat”.
  2. Menentukan apakah opini tersebut adalah opini negatif atau positif. Contoh opini positif   “Supermarket X bersih, enak belanja disana”. Sedangkan contoh opini negatif  bisa dilihat pada contoh no 1.
  3. Apa yang menjadi topik dari opini? Misalnya pada contoh no 1, yang menjadi topik adalah “layanan kasir”  sedangkan pada contoh no 2 yang menjadi topik adalah “kebersihan”

Dengan cara manual, analisa opini ini bisa saja dilakukan. Misalnya memonitor berita-berita di media masa.  Tapi untuk data tweet, cara manual tidak mungkin bisa dilakukan. Ini karena jumlah datanya yang sangat besar dan terus mengalir. Misalnya untuk tweet berbahasa Indonesia saja diperkirakan ada aliran 6 juta tweet per hari (2010). Disinilah peranan text processing, yang secara otomatis dapat  memproses data.

Sebulan yang lalu saya mengadakan eksperimen kecil untuk analisis opini. Tentunya detil teknis tidak saya tulisan di posting ini dan nanti bisa  dibaca di papernya. Data yang saya gunakan adalah tweet yang mengandung  kata  dua operator GSM di Indonesia. Saya kumpulkan dari bulan Agustus 2010 dan masih berlangsung sampai sekarang. Tapi untuk eksperimen ini, saya hanya gunakan sebagian data saja (35 ribuan tweet).

Beberapa hal  dari hasil eksperimen:

  • Dari tweet yang mengandung kata operator GSM tersebut, 65% mengandung opini.
  • Dari tweet opini tersebut, opini negatif mencakup 77%. Ini  masuk akal  karena orang biasanya saat puas diam, dan saat kesal menulis tweet negatif.
  • Kata-kata kunci (keyword)  yang ditemukan oleh software adalah: “emosi, mahal, bb ,<makian>, aneh,  jaringan, pulsa, provider, bis, paket, sms,  sinyal”.

 

Jika dibuat grafik, bentuknya seperti ini

 

Garis biru memperlihatkan opini negatif, sedangkan garis merah adalah opini positif.  Sumbu x adalah hari.  Terlihat opini negatif  mendominasi.  Analisis keyword juga dapat dilakukan per hari. Misalnya pada tanggal 9 September 2010,  satu hari menjelang  idul fitri, salah satu keyword yang menonjol adalah “cs”, yaitu customer support.  Contoh tweetnya:

“Susah bgt sih hubungin CS  [xxx]  ..sibuk2 mlulu”

 “tadi gua sempet nyolot22an sama CS nya [xxxx]   HAHAHA songong bet sih lau neng”

Ini mungkin disebabkan jumlah CS yang terbatas di  menjelang  idul fitri.

 

Tentunya masih banyak lagi hal-hal yang bisa digali, tapi  perlu eksperimen dan studi lebih lanjut, dan itu yang sedang saya lakukan bersama beberapa mahasiswa bimbingan saya   🙂

 

 

Stop words untuk Bahasa Indonesia

23 July 2008 at 11:27 | Posted in bahasa indonesia, penelitian, text processing | 54 Comments

Stop words adalah kata umum (common words) yang biasanya muncul dalam jumlah besar dan dianggap tidak memiliki makna.  Stop words umumnya dimanfaatkan dalam task information retrieval, termasuk oleh Google (penjelasannya di sini).  Contoh stop words untuk bahasa Inggris diantaranya “of”, “the”.  Sedangkan untuk bahasa Indonesia diantaranya “yang”, “di”, “ke”.

Saya pernah membuat daftar stop words  bahasa Indonesia untuk tugas salah satu matakuliah. Tujuannya waktu itu bukan untuk information retrieval, tapi untuk klasifikasi.  Saya gunakan stop words untuk mengurangi jumlah kata yang harus diproses.

Saya membuat daftar stop words dengan cara mengumpulkan kata paling banyak muncul pada corpus (saya menggunakan beberapa ratus berita Kompas),  setelah diurutkan kemudian diperiksa secara manual satu persatu.  Hasil lengkapnya dapat didonwload di:  http://web.archive.org/web/20100104090147/http://fpmipa.upi.edu/staff/yudi/stop_words_list.txt

Karena daftar itu dibuat secara manual dan untuk task klasifikasi, ada beberapa kata yang mungkin dapat diperdebatkan apakah stop word atau bukan, misalnya  “utara”, “senin”, “gedung” dan sebagainya.  Jadi silahkan diedit sesuai kebutuhan.  Seingat saya sih daftar tersebut sudah diurutkan dari kata yang frekuensinya paling tinggi.

Daftar stop words untuk bahasa lain (23 bahasa) dapat dilihat di: http://www.semantikoz.com/2008/04/02/free-stop-word-lists-in-23-languages/

Kelas Kata (Word Class) Bahasa Indonesia untuk POS Tagger

7 July 2008 at 18:26 | Posted in bahasa indonesia, penelitian, text processing | 21 Comments

Update Mar 2017: Saat ini sudah ada pos tagger bahasa Indonesia, walaupun kelas katanya tidak selengkap jika melihat Tata Bahasa Indonesia. Saya bahas di posting ini.

Setelah googling, ternyata sulit juga mencari informasi mengenai kelas kata bahasa Indonesia.  Apalagi corpus yang sudah diberi tag atau software Part of Speech (POS) Tagger-nya (atau saya yang salah mencarinya ya?).  Satu-satunya yang saya peroleh adalah dokumen TA seorang mahasiswa UI. Kondisi ini termasuk menyedihkan untuk bahasa yang digunakan oleh sekitar 200 juta orang dan dimengerti di beberapa negara (Malaysia, Singapura, Brunei).

Pemberian tag kelas-kata pada dokumen atau kalimat bermanfaat untuk berbagai hal: information retrieval,  language generator, information extraction, summarization dan machine translation.  Berikut adalah contoh kalimat yang telah diberi tag: “Anwar/NNP meninggalkan/VB Kedubes/NN Turki/NNP”.  Mengikuti penaamaan corpus Penn Treebank, NNP adalah proper noun, VB kata kerja, NN adalah kata benda.

Daripada hanya mengeluh , saya coba membuat ringkasan mengenai kelas kata bahasa Indonesia berdasarkan dua buku. Saya fokuskan terhadap aturan untuk setiap kelas kata karena inilah yang dibutuhkan sofware tagger untuk corpus yang sedang saya kumpulkan. Beberapa aturan yang saya perkirakan jarang muncul juga dihilangkan.

Pengembangan di tahap awal adalah pembuatan POS-tagger berdasarkan aturan (ruled-based), kemudian dilanjutkan dengan membuat POS-tagger yang menggunakan Hidden Markov Model.  Rencananya sih kedua tagger ini akan dijadikan open source.

Berikut adalah ringkasannya:

1. Kata Benda
Menurut [KER88][KOS04], kata benda dapat ditentukan dari dua hal, bentuk dan ciri. Dari bentuk, kata yang mengandung ke-an, pe-an, pe-, -an, ke-,  -at, -in, -wan, -wati, -isme, -isasi, -logi, -tas dapat dicalonkan sebagai kata benda. Misalnya “kebakaran”, “pembunuhan”, “karyawan”.  Sedangkan berdasarkan ciri, ciri utama kata benda adalah dapat diperluas dengan “yang”+ kata sifat,  misalkan “sinar yang terang”.  [KOS04] menambahkan ciri:  diawali “bukan” dan tidak diawali “tidak”, misalnya “bukan niatnya”.

2. Kata Kerja
Menurut [KER88] berdasarkan bentuk, kata yang mengandung  me-, ber-, -kan, di-, -i, ter- dapat dicalonkan sebagai kata kerja. Misalnya “berlari”, “menyayi”.  Sedangkan berdasarkan ciri, ciri utama kata kerja adalah kata yang dapat diperluas dengan “dengan”+kata sifat. Misalnya “tidur dengan nyenyak”.  [KOS04] menambahkan ciri: tidak dapat didahului kata “paling”, dapat didahului “akan”, “sedang”, “sudah” dan “tidak”. Ciri-ciri dari [KOS04] bukan ciri utama karena tidak eksklusif untuk kata kerja. Misalnya “sudah harum” dengan “harum” adalah kata sifat.

3. Kata Sifat
Menurut [KER88] kata sifat adalah segala kata yang dapat mengambil bentuk se + reduplikasi + nya, serta dapat diperluas dengan: “paling”, “lebih” dan  “sekali”. Misalnya “seteliti-telitinya”, “sebagus-bagusnya”, “paling cepat”, “lebih kuat”, “sakit sekali”.

4. Kata Keterangan
Kata keterangan adalah kata yang menjelaskan kata yang lain. [KER88] membagi kata keterangan menjadi 13 jenis: Keterangan kualitatif: “ia berjalan perlahan-lahan”; Keterangan waktu: “sekarang”, “nanti”, “kemarin”, “kemudian”, “sesudah itu”, “lusa”, “sebelum”, “minggu depan”; Keterangan tempat: “di sini”, “di situ”, “ke sana”, “ke mari”; Keterangan modalitas: “memang”, “pasti”, “sungguh”, “tentu”, “tidak”, “bukan”, “benar”, “sebenarnya”, “mungkin”, “rasanya”, “mudah-mudahan”, “hendaknya”, “jangan”,”mustahil”; Keterangan aspek: “sedang”, “sementara”, “sudah”, “telah”, “sering”, “biasa”; Keterangan derajat: “amat”, “hampir”, “kira-kira”, “sedikit”, “cukup”, “hanya” “satu kali”; Keterangan kesertaan: “bersama”; Keterangan syarat: “jika”, “seandainya”; Keterangan perlawanan: “meskipun”, “meski”,”jika”; Keterangan sebab: “sebab”, “karena”, “oleh karena”; Keterangan akibat: “sehingga”; Keterangan tujuan: “supaya”, “agar”, “untuk”, “hendak”; Keterangan perbandingan: “sebagai”, “seperti”, “bagaikan”; Keterangan perwatasan: “kecuali”, “hanya”.

5. Kata Depan
Kata depan adalah kata yang digunakan untuk merangkaikan kata atau bagian kalimat [KER88]. Kata-kata depan terpenting adalah  [KER88][KOS04]: “di”, “ke”, “dari”, “pada”, “akan”, “sejak”, “dengan”, “oleh”, “demi”, “guna”, “untuk”, “buat”, “berkat”, “antara”, “tentang”, “hingga”, “menurut”, “menghadap”, “mendapatkan”, “melalui”, “menuju”, “menjelang”, “sampai”, “atas”, “antara”, “bersama”, “beserta”, “sekeliling”, “selama”, “sepanjang”, “mengenai”, “terhadap”, “bagaikan”, “daripada”, “kepada”, “oleh sebab”, “sampai dengan”, “selain itu”.

6. Kata Sambung
Kata sambung adalah kata yang menghubungkan kata-kata , bagian kalimat atau kalimat  [KER88]. Beberapa kata sambung menurut [KER88]: “dan”, “lagi”, “lagipula”, “serta”, “tetapi”, “akan tetapi”, “melainkan”, “apabila”, “ketika”, “bila”, “demi”, “sambil”, “sebelum”, “sedang”, “sejak”, “selama”, “semenjak”, “sementara”, “seraya”, “setelah”, “sesudah”, “waktu”, “supaya”, “agar”, “karena”, “karena itu”, “sehingga”, “sampai”, “jika”, “andaikan”, “asal”, “asalkan”, “seandainya”, “atau”, “maupun”, “seperti”, “bagaikan”, “meskipun”, “biarpun”, “maka”, “adapun”, “akan”, “yakni”, “umpama”, “bahwa”.  Ada juga kalimat yang tidak memerlukan kata sambung. Misalnya “Dia datang, kami berangkat”.

7. Kata Ganti
Kata ganti adalah segala kata yang dipakaikan untuk mengganti kata benda [KER88]. Menurut [KER88] kata ganti dapat dibagi menjadi enam jenis. Kata ganti orang: “saya”, “aku”, “dia”, “kami”, “kita”, “kamu”, “mereka”, “anda”; Kata ganti empunya: -mu, -ku, -nya (“bukuku”, “bukumu”, “bukunya”); Kata ganti penunjuk: “ini”, “itu”, “di sana”, “di sini”, “di situ”; Kata ganti penghubung: “yang”, “tempat” (“kotak yang berisi kalung”, “kota tempat kita bertemu”); Kata ganti penanya: “apa”, “siapa”, “mana”, “mengapa”, “berapa”, “bagaimana”, “bilamana”, “kenapa”, “betapa”. Kata ganti tak tentu: “masing-masing”, “siapa-siapa”, “seseorang”, “para”, “barang”, “sesuatu”, “salah satu”, “barang siapa”.

8. Kata Bilangan
[KER88]  membagi kata bilangan menjadi empat jenis: Kata bilangan utama: “satu”, “dua”, “ribu”, “juta”, “miyar”, “triliun” ; Kata bilangan tingkat “pertama”, “kedua”; Kata bilangan tak tentu: “beberapa”, “segala”, “semua”, “tiap-tiap”, “sebagainya”; Kata bilangan kumpulan: “kedua”, “kesepuluh”, “bertiga”, “bertujuh”.

Kata Tugas
Dapat dilihat bahwa kata keterangan, kata depan dan kata sambung seringkali sulit ditentukan karena saling tumpang tindih. Oleh karena itu  [KER88]  mengusulkan kelas kata pengganti yaitu kata tugas. Jadi semua kata yang tidak masuk ke dalam kata benda, kerja dan sifat akan masuk ke dalam kelas kata tugas ini.

Penentuan kelas kata yang tidak jelas seperti ini sebenarnya adalah masalah utama yang harus dipecahkan aplikasi POS-Tagger.

Mungkin perlu diteliti apakah kata keterangan, sambung, depan memang dapat diganti dengan kata tugas. Tentunya berdasarkan kinerja untuk task tertentu, misalnya untuk summmarization atau information retrieval.

Referensi:
[KER84] Keraf, Goris (1984), “Tatabahasa Indonesia”, Nusa Indah.
[KOS04] Kosasih, E (2004), “Kompetensi Ketatabahasaan dan Kususastraan”, Yrama Widya, Cetakan 2.

Java untuk Text Processing

5 July 2008 at 16:57 | Posted in penelitian, text processing | 4 Comments
Tags:

Update:
Split kata yang dipisahkan dengan koma sambil langsung ditrim

String[] arrHeader = line.trim().split("\\s*,\\s*");

Saat saya membuat tools untuk eksperimen tesis, ada beberapa class Java yang paling sering digunakan.  Class tersebut adalah:

  • Scanner untuk membaca file teks dan memparsing kalimat menjadi kata.
  • Printwriter untuk menulis file teks. Sangat dianjurkan untuk menyimpan hasil proses ke file pada setiap tahap.
  • HashMap untuk menyimpan informasi yang berkaitan dengan kata. Misalnya probabilitas dan frekuensi kemunculan kata.  Mengapa HashMap? karena waktu untuk menambah dan mengambil data dari struktur ini tetap dan saya tidak membutuhkan keterurutan.

Berikut contoh  pemakaian ketiga class tersebut untuk menghitung frekuensi kata di dalam dokumen dan menuliskannya ke file:

import java.io.*;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Map;

public class HitungFrek {
	public static void main(String[] Args) {
		HashMap<String,Integer> countWord  = new HashMap<String,Integer>();  //frekuensi word di document
		String namaFileInput  = "c:\\tes.txt";
		String namaFileOutput = "c:\\freq.txt";
		Integer freq;
		String  kata;
		File f = new File(namaFileInput);
		try {
			Scanner sc = new Scanner(f);
			//hitung frekuensi
			while (sc.hasNext()) {
				kata = sc.next();
				freq = countWord.get(kata);  //ambil kata

				//jika kata itu tidak ada, isi dengan 1, jika ada increment
				countWord.put(kata, (freq == null) ? 1 : freq + 1);
			} //end while
			sc.close();
			//simpan hasilnya ke file teks
			PrintWriter pw = new PrintWriter(namaFileOutput);

			//loop untuk semua isi countWord
			for (Map.Entry<String,Integer>entry : countWord.entrySet()) {
				kata = entry.getKey();
				freq = entry.getValue();
				pw.println(kata+"="+freq);  //tulis ke file
			} //endfor
			pw.close();
		} catch (Exception e) {
			e.printStackTrace();
		} //endtry
	}
}

update Okt 2010: Kode lain yang bermanfaat saat loop hashmap, traversal berdasarkan key-nya.

for (String word : wordCount.keySet()) {
}

Berdasarkan key,value

for (Map.Entry<String,Double>entry : hmVectS1.entrySet()) {
            String key  = entry.getKey();
            Double val  = entry.getValue();
            System.out.println(key + "------> " + val);
        }

Pengolahan Teks (Text Processing)

10 October 2007 at 19:11 | Posted in penelitian, text processing | 95 Comments

Tulisan ini seharusnya mendahului tulisan saya mengenai peringkasan teks (text summarization) karena ini merupakan latar belakangnya tapi biarlah 🙂

Riset mengenai pemrosesan teks sebenarnya telah lama dilakukan, untuk peringkasan teks misalnya, telah mulai diteliti sejak tahun 1958 oleh peneliti dari IBM. Meredup di tahun 70-80 dan kembali bergairah di akhir tahun 90-an sampai sekarang. Mengapa pemrosesan teks kembali bangkit menjadi “primadona”?

Jawabannya adalah internet. Jumlah dokumen teks yang ada di internet tumbuh dengan sangat pesat. Menurut riset dari Barkeley, ukuran internet di tahun 2002 mencapai 532,897 Terabytes dengan sekitar 41.7%-nya adalah teks (bayangkan tuh jadi berapa Tera dokumen!, dan ini berupa teks bukan multimedia!). Dokumen teks ini dapat berupa static page, dynamic page, file dokumen, email, forum online dan blog.

Dokumen teks juga semakin berperan sejalan munculnya web 2.0 yang mendorong pengguna internet untuk membuat dan berbagi content (dua yang paling terkenal: blog dan social network). Aliran content segar dengan volume besar per harinya membanjiri internet. Anda dapat membayangkan jumlah posting seluruh blog sedunia dalam sehari? Coba tambahkan dengan berita dari seluruh koran, kantor berita! Berapa ratus atau ribu halaman mungkin (per harinya). Tambahkan lagi email.. huh.

Volume yang besar membuat pengguna internet semakin sulit memperoleh informasi yang sesuai dengan apa yang diinginkan. Untuk kasus blog, penggunaan blog aggregator dapat membantu, tetapi tetap saja ada kemungkinan blog atau posting yang menarik yang terlewat dengan sia-sia (mungkin termasuk blog ini hehe, kasihan deh).

Dibutuhkan teknik tertentu untuk mengolah dokumen teks. Inilah fungsi dari pengolahan teks (text processing).

Pengolahan teks mencakup:

  • Information retrieval: pencarian dokumen
  • Klasifikasi dokumen: membagi dokumen ke dalam kelas-kelas yang telah ditentukan sebelumnya. Misalnya secara otomatis dapat menentukan apakah dokumen ini masuk ke dalam kategori politik, ekonomi, militer dan lain sebagainya.
  • Document Clustering: mirip dengan klasifikasi dokumen, hanya saja kelas dokumen tidak ditentukan sebelumnya. Misalnya berita tentang lalulintas dapat menjadi satu kelas dengan berita tentang kriminal karena didalamnya banyak memuat tentang orang yang tewas, cedera, rumah sakit dsb.
  • Peringkasan teks. Menghasilkan ringkasan suatu dokumen secara otomatis.
  • Ekstraksi informasi. Mengekstrak informasi yang dianggap penting dari suatu dokumen. Misalnya pada dokumen lowongan, walaupun memiliki format beragam dapat diekstrak secara otomatis job title, tingkat pendidikan, penguasaan bahasa dsb.

Contoh perusahaan yang sukses menerapkan text processing? Tidak lain dan tidak bukan adalah Google 🙂  Searching, news.google.com, ad-sense adalah contoh-contoh aplikasi text procssing.

Mengingat pentingnya ilmu text processing, jurusan ilkom di seluruh dunia mulai menawarkan perkuliahan yang khusus membahas tentang hal ini. Saya sendiri setelah lulus merencanakan akan membuka kuliah text processing ini di Ilkom UPI. Tapi saya harus lulus dulu deh hehe.

Peringkasan Teks (Text Summarization)

7 October 2007 at 20:30 | Posted in penelitian, peringkasan/summarization, text processing | 8 Comments
Tags: ,

Peringkasan teks adalah topik tesis saya (yang sayangnya sampai sekarang belum beres juga hehe). Supaya semangat mengerjakan lagi tesis, saya coba buat tulisan yang tidak terlalu ilmiah tentang topik ini.

Aplikasi peringkasan teks sebenarnya ada dimana-mana. Mulai dari abstrak pada karya ilmiah sampai dengan judul artikel. Saat kita menggunakan Google, search engine itu akan menampilkan beberapa kata berisi rangkuman dokumen sehingga kita dapat memperkirakan isi dokumen tersebut tanpa harus melihat dokumen aslinya. Contoh berikut memperlihatkan salah satu hasil google dengan dengan keyword “Pemilu”:

contoh ringkasan di google

Kata-kata “Pekerjaan Rumah KPU dst” merupakan ringkasan.

Kalau kita lihat bagaimana Google meringkas dokumen, ternyata si-Google ini tidak sekedar mengambil beberapa kalimat pertama dari dokumen (main potong). Jadi bagaimana caranya? Apa secara manual mereka membuat sendiri ringkasan setiap dokumen? (dengan sekitar 10 milyar dokumen yang mereka miliki, jawabannya bisa ditebak hehe). Meledaknya jumlah dokumen teks online membuat peringkasan teks secara otomatis menjadi semakin penting.

Nah, berdasarkan cara membuatnya, ada dua jenis ringkasan. Jenis pertama, kalimat atau kata yang ada dalam ringkasan diambil secara utuh dari dokumen aslinya. Contohnya ringkasan yang dilakukan Google. Google tidak akan menambahkan kata yang baru yang tidak ada dalam dokumen aslinya. Jenis ini disebut extractive summary.

Jenis kedua, ringkasan yang menambahkan kata baru dan dapat merubah sususan kalimat. Sebenarnya ini lebih natural karena manusia membuat ringkasan dengan cara seperti ini. Coba anda meringkas sebuah dokumen, perhatikan walaupun saat meringkas kita akan mengambil kata dari dokumen asal, tetapi kadang-kadang kita menambahkan kata baru atau merubah sususan kalimat sehingga lebih padat. Jenis kedua ini disebut abstractive summary.

Mana yang lebih mudah bagi komputer? Dapat ditebak bahwa cara pertama yaitu extractive lebih mudah bagi komputer. Cara abstractive umumnya membutuhkan pembangkit kalimat (language generator) yang lebih kompleks dan membutuhkan waktu lebih lama.

Dua jenis ringkasan ini merupakan topik thesis saya, pada artikel berikutnya akan saya bahas secara lebih rinci mengenai extractive dan abstractive summarization.

Next Page »

Blog at WordPress.com.
Entries and comments feeds.