POS Tagger Bahasa Indonesia dengan Python

20 February 2018 at 19:51 | Posted in bahasa indonesia, kuliah, penelitian, text processing | 2 Comments

Posting sebelumnya: POS Tagger dengan Syntaxnet

Secara bertahap, saya dan istri akan migrasi dari Java ke Python. Salah satu yang kami perlukan adalah POS (Part of Speech)-Tagger Bahasa Indonesia.

Ini cara yang paling sederhana  karena saya sudah sediakan modelnya, untuk cara trainingnya ada di bagian bawah.

Saya menggunakan CRFTagger, jadi library yang perlu diinstall: numpy, nltk dan python-crfsuite.

Lalu download pretrained model yang saya buat berdasarkan data Fam Rashel (200rb-an token) di https://drive.google.com/open?id=12yJ82GzjnqzrjX14Ob_p9qnPKtcSmqAx

Untuk menggunakannya (sesuaikan path jika diperlukan):

from nltk.tag import CRFTagger
ct = CRFTagger()
ct.set_model_file('all_indo_man_tag_corpus_model.crf.tagger')
hasil = ct.tag_sents([['Saya','bekerja','di','Bandung']])
print(hasil)

Hasilnya akan seperti ini:

[[(‘Saya’, ‘PRP’), (‘bekerja’, ‘VB’), (‘di’, ‘IN’), (‘Bandung’, ‘NNP’)]]

Jika ada yang berminat untuk training sendiri, ada beberapa dataset POS-Tag Bahasa Indonesia:

https://github.com/UniversalDependencies/UD_Indonesian
https://github.com/famrashel/idn-tagged-corpus
http://www.panl10n.net/english/OutputsIndonesia2.htm
https://lindat.mff.cuni.cz/repository/xmlui/handle/11234/1-1989

Saya menggunakan data milik Fam Rashel, code untuk training-nya adalah sbb (mungkin belum efisien, saya masih belajar Python):

from nltk.tag import CRFTagger

jumSample = 500000
namaFile = "/home/yudiwbs/dataset/pos-tag-indonesia/idn-tagged-corpus-master/Indonesian_Manually_Tagged_Corpus.tsv"
with open(namaFile, 'r', encoding='utf-8') as f:
    lines = f.read().split('\n')

pasangan = []
allPasangan = []

for line in lines[: min(jumSample, len(lines) - 1)]:
    if line == '':
        allPasangan.append(pasangan)
        pasangan = []
    else:
        kata, tag = line.split('\t')
        p = (kata,tag)
        pasangan.append(p)

ct = CRFTagger()
ct.train(allPasangan,'all_indo_man_tag_corpus_model.crf.tagger')
#test
hasil = ct.tag_sents([['Saya','bekerja','di','Bandung'],['Nama','saya','Yudi']])
print(hasil)

Dokumentasi lengkap tentang lib POS-Tag NLTK dapat dilihat di: http://www.nltk.org/api/nltk.tag.html 

Untuk sekarang saya belum buat pengukuran kinerja model yang dihasilkan.

Advertisements

NER (Named Entity Recognition) Bahasa Indonesia dengan Stanford NER

18 February 2018 at 22:16 | Posted in bahasa indonesia, kuliah, penelitian, text processing | Leave a comment

Posting sebelumnya tentang NER

Untuk mengekstrak named entity Bahasa Indonesia, kita dapat memanfaatkan library Stanford NER untuk membuat model yang di-train dengan dataset Bahasa Indonesia. Pertama download Stanford NER di: https://nlp.stanford.edu/software/CRF-NER.html#Download

Sedangkan dataset NER Bahasa Indonesia untuk training dapat diperoleh di:

 https://github.com/yohanesgultom/nlp-experiments/blob/master/data/ner/training_data.txt

dan

https://github.com/yusufsyaifudin/indonesia-ner/tree/master/resources/ner

Catatan: format dataset di atas tidak sesuai dengan Stanford NER, jadi perlu dikonversi ke format dua kolom seperti ini:

Sementara	O
itu	O
Pengamat	O
Pasar	O
Modal	O
Dandossi	PERSON
Matram	PERSON
mengatakan	O
,	O
sulit	O
bagi	O
sebuah	O
kantor	ORGANIZATION
akuntan	ORGANIZATION
publik	ORGANIZATION
(	O
KAP	ORGANIZATION
)	O

Selanjutnya untuk training, dokumentasinya ada di:

https://nlp.stanford.edu/software/crf-faq.html#a:   

Setelah training selesai dan model didapat, maka cara menggunakannya adalah sebagai berikut.

Ambil stanford-ner-resources.jar, letakkan di direktori lib. Jika menggunakan Gradle maka setting gradle-nya sbb:


repositories {
  flatDir {
    dirs 'libs'
  }
}

dependencies {
 testCompile group: 'junit', name: 'junit', version: '4.12'
 compile group: 'edu.stanford.nlp', name: 'stanford-parser', version: '3.8.0'
 compile name: 'stanford-ner-3.8.0'
}

Selanjutnya gunakan code yang ada di NERDemo.java.  Sesuaikan variabel serializedClassifier dengan lokasi model bahasa Indonesia. Outputnya akan seperti ini untuk input “Budi Martami kuliah di UPI yang berlokasi di Bandung”:


---
Budi/PERSON Martami/PERSON kuliah/O di/O UPI/ORGANIZATION yang/O berlokasi/O di/O Bandung/LOCATION ./O
---
Budi	PERSON
Martami	PERSON
kuliah	O
di	O
UPI	ORGANIZATION
yang	O
berlokasi	O
di	O
Bandung	LOCATION
.	O
---

Ekstraksi Pasangan Pertanyaan-Jawaban dari Forum Online

30 January 2018 at 10:53 | Posted in bahasa indonesia, penelitian, text processing | Leave a comment

Forum online masih memiliki potensi yang besar walaupun popularitasnya turun sejalan dengan populernya group FB dan app group chat.  Di forum online, thread sudah dikelompokkan dalam topik dan umumnya ada moderator yang mencegah spam dan bot sehingga  data lebih “bersih” dibandingkan Twitter.  Saya jadi tertarik untuk mencoba me-mining data di forum online ini.

Salah satu fungsi utama forum adalah untuk media tanya jawab.  Ini yang rencananya saya akan ekstrak, pasangan pertanyaan dan jawabannya (PPJ). Pasangan ini  nantinya akan digunakan sebagai basis pengetahuan  QA (question-answering) system, termasuk chatbot.

Saya memilih forum online kaskus, dengan sub topik roda-empat, dan dengan thread mengenai mobil ayla agnia (karena paling banyak).  Bentuknya megathread, yaitu satu thread besar dengan ratusan halaman. Saya crawl dengan sangat pelan (30 menit per halaman) jadi mudah-mudahan tidak menggangu.  Untuk mengambil pasangan pertanyaan-jawaban (PPJ),  saya ambil posting yang menggunakan quote  dan reply (gambar bawah).

quote

Masalahnya, tidak semua quote dan reply adalah PPJ. Ada  quote yang bukan pertanyaan, ada reply yang berbentuk pertanyaan balik (bukan jawaban) dan ada  pasangan quote-reply yang tidak relevan (misal sapaaan selamat pagi dan jawabannya).

Saya menggunakan klasifikasi teks untuk mencari pasangan quote-reply yang merupakan PPJ. Pelabelan dilakukan oleh saya sendiri, dari  1030 pasangan quote-reply, 189 masuk ke kelas PPJ dan 841 non-PPJ.   Di luar dugaan, ternyata hanya sedikit pasangan quote-reply yang dapat digunakan (10%-an).  Penyebabnya mungkin mega-thread juga digunakan untuk tempat kumpul-kumpul sehingga banyak percakapan yang keluar dari topik.

Selanjutnya saya coba beberapa teknik klasifikasi dan untuk pertama kalinya saya menggunakan scikit-learn  (pelan-pelan migrasi dari Java ke Python 🙂 ) .   Karena ini eksplorasi pertama, supaya cepat saya tidak menggunakan praproses dan fitur-fitur lain, hanya bag-of-words teks quote dan reply-nya. Masalah imbalance juga tidak ditangani.

Data displit menjadi 70% data training, 30% data validasi. Hasil terbaik adalah dengan teknik SGD sbb  (precision, recall, F1):

Non PPJ:  0.89, 0.97, 0.93
PPJ: 0.76, 0.43, 0.55

Hasilnya menurut saya lumayan, mengingat kelas PPJ hanya 10% (kelas minoritas) dan belum dilakukan optimasi apapun.

Untuk eksplorasi berikutnya (selain tentunya meningkatkan akurasi):

  • Lintas domain, misalnya model yang ditraining untuk data otomotif sebagus apa jika diaplikasikan ke data thread tentang smartphone.
  • Pertanyaan-jawaban yang berbentuk thread diskusi. Jadi PPJ yang saling berkait.  ini mungkin  cocok untuk chatbot, agar bot dapat memberikan respon yang lebih natural.
  • Membangun QA System atau chatbot yang menggunakan data ini.

 

Link ke paper: https://osf.io/preprints/inarxiv/5rxak/

Web App dengan Python Flask, Nginx dan uwsgi.

29 September 2017 at 18:23 | Posted in Uncategorized | Leave a comment

Walapun sempat mengerjakan beberapa proyek dengan PHP, pengalaman saya membuat web app dengan PHP ternyata tidak menyenangkan. Pernah coba menggunakan Java, tapi menurut saya terlalu rumit untuk web app. Sejalan dengan eksplorasi saya belajar Python untuk keperluan datamining, maka sekalian saja menggunakan Python untuk membuat applikasi web, baik frontend maupun untuk RestFul-API.

Di posting sebelumnya saya mencoba membuat sendiri dari nol, tapi ternyata rawan kesalahan. Setelah lihat-lihat beberapa framework, menurut saya yang paling menarik adalah Flask (http://flask.pocoo.org/).  Seperti biasa, saya share di blog ini untuk catatan pribadi dan mudah-mudahan bermanfaat bagi pemula seperti saya.

Saya menggunakan instance Ubuntu AWS  dengan client Windows+Putty.  Pertama siapkan port forwarding agar kita bisa mencoba app dengan aman via SSH.  Di Putty, pilih settings->connection-SSH-tunnels. Saya forward port 5000, jangan lupa klik add (gambar bawah). Simpan session supaya tidak perlu mengeset berulangkali.

tunnel

 

Pertamakali yang perlu dilakukan adalah install pip, tools untuk menginstall lib python.

sudo apt-get update
sudo apt-get install python-pip

Kemudian install nginx sebagai webserver

sudo apt-get install nginx

Pastikan port 80 sudah dibuka (kalau digital ocean dibuka, tapi kalau AWS defaultnya ditutup),  dan buka alamat server kita di browser, harusnya pesan bahwa nginx sudah terinstall akan keluar.

Selanjutnya kita akan menginstall virtual environment (virtualenv). Ini penting dan wajib karena memungkinkan kita menginstall lib Python untuk suatu proyek  yang terisolasi dengan proyek lainnya. Tanpa virtualenv, install lib bisa membuat proyek lain jadi tidak jalan (pengalaman pahit pribadi hehe).

sudo pip install virtualenv 

Selanjutnya buat directory project dan masuk.

mkdir myproject
cd myproject

Dalam direktori ini set virtual env dengan:

 virtualenv myproject-env 

untuk mengaktivasi virtual env ini, gunakan

source myproject-env/bin/activate 

perhatikan prompt akan berubah. Sekarang kalau kita jalankan pip, maka lib tersebut akan terinstall di virt env ini saja (myproject/myproject-env).  Tapi kalau installnya lewat apt-get tetap berlaku untuk semua.

Untuk mengetest, coba jalankan

 which python 

maka yang muncul adalah lokasi Python di myproject. Untuk menonaktifkan virt env ini,  ketik  deactivate (tapi jangan lakukan dulu sekarang).

Selanjutnya install Flask dan uwsgi. Flask untuk framework, sedangkan uwsgi untuk koneksi dengan nginx.

 pip install uwsgi flask 

Selanjutnya kita akan membuat code sederhana hello world.

from flask import Flask
from werkzeug.serving import run_simple
app = Flask(__name__)

@app.route("/")
def beranda():
     return "Hello World"

if __name__ == '__main__':
     run_simple('0.0.0.0', 5000, app, use_reloader=True, use_debugger=True, use_evalex=True)

Jalankan

 python myapp.py 

dan buka browser dengan alamat  http://localhost:5000/  maka di browser akan muncul “Hello World” (jika menggunakan putty, pastikan tunneling sudah benar).  Jika code diupdate maka otomatis akan dilakukan reload. Gampang kan 🙂

Inilah kelebihan Flask, sangat mudah untuk dijalankan dan didebug.  Tapi tentu jika sudah operasional cara seperti ini tidak cocok. Sekarang kita akan menghubungkan app ini dengan web server nginx melalui uwsgi.

Pertama buat konfigurasi wsgi dulu, buat file uwsgi-myproject.ini dengan isi sebagai berikut:

Catatan: Sesuaikan path lokasi project di variabel home. Pastikan nama directory virtenv sudah cocok.

[uwsgi]
home = /home/ubuntu/myproject
wsgi-file = %(home)/myapp.py
socket = 127.0.0.1:3033
callable = app
module = app
daemonize = %(home)/app.log
pidfile = %(home)/app.pid
virtualenv= %(home)/myproject-env

Sekarang kita perlu update nginx agar mendengarkan socket uwsgi.  Buka /etc/nginx/nginx.conf   (mungkin perlu sudo) lalu pada bagian  ” http { ” tambahkan konfigurasi server berikut:

http {
  ##
  # Basic Settings
  ##
  ...
  server {
    listen 80;
    location / { include uwsgi_params; uwsgi_pass 127.0.0.1:3033; }
  }
}

Selanjutnya hapus page default nginx dan restart nginx.

sudo rm -v /etc/nginx/sites-enabled/default
sudo service nginx restart

Sekarang jalankan uwsgi project kita dengan cara

 uwsgi uwsgi-myproject.ini 

Sekarang buka di browser alamat server anda (bukan localhost:5000), yang tadinya ucapan default dari nginx harusnya akan berubah menjadi “Hello world” . Jika tidak, coba lihat catatan error di di file app.log (tail -10 app.log)

Untuk men-stop uwsgi, lakukan dengan (hati-hati, parameternya adalah app.pid bukan file uwsgi.ini):

 uwsgi --stop app.pid 

Tips: jika di-log keluar pesan seperti ini: “probably another instance of uWSGI is running on the same address”. Reset port dengan

 sudo fuser -k 3033/tcp 

Untuk mengaktifkan autoreload gunakan:

 uwsgi --py-autoreload 1 

 

 

 

 

 

 

 

 

 

App mencari makan halal di Bali

1 September 2017 at 17:24 | Posted in Uncategorized | Leave a comment

Link ke app: https://play.google.com/store/apps/details?id=yuliadi.com.blhlv2

Ide pembuatan app ini sudah cukup lama. Saat saya datang ke Bali,  salah satu hal yang menyulitkan adalah mencari makan halal. Biasanya googling dulu, lalu tandai di peta. Tetapi ada beberapa tempat yang jarang dibahas orang, tidak mencantumkan halal di restorannya dan diwebsitenya padahal sebenarnya punya sertifikat halal MUI.  Ini diperparah situs MUI yang tidak menyedikan informasi yang mudah diakses masyarakat.

Sekitar sebulan yang lalu, untungnya ada pelatihan pengembangan Android dari Google untuk para dosen. Lumayan panjang 5 hari full time. Sambil ikut pelatihan saya mulai iseng mulai buat app ini.  Berlanjut saat saya ikut menemani istri ke Bali dalam rangka konferensi.

Saya tidak menduga ternyata perlu waktu banyak untuk mengumpulkan dan memverifikasi data.  Data dari MUI (pusat dan lokal Bali) berbentuk pdf dan isinya lebih fokus terhadap perusahaan yang mendaftarkan dan tidak ada informasi alamat.  Perlu dicek satu persatu dengan Google Streetview, Zomato dan Tripadvisor.

Setelah data tempat makan yang dapat sertifikat MUI, saya lanjutkan dengan data yang self-certified, artinya mengklaim halal dengan tulisan “halal” ditempel di depan tempat restoran atau diwebsitenya. Setelah googling tempat-tempat yang katanya halal, ternyata banyak yang sebenarnya tidak mengklaim dirinya halal karena menyajikan minuman alkohol. Orang mengganggap halal karena berasumsi karena tempat itu hanya menyajikan seafood, makanan timur tengah dan sunda.  Mungkin ke depannya saya akan tambahkan kategori no-pork tanpa atau dengan alkohol.

Dari sisi teknis, banyak yang saya pelajari. Mungkin nanti detilnya akan diposting terpisah. Ini beberapa yang saya ingat:

  • Recyleview, walaupun lebih ribet ternyata lebih cepat daripada listview.
  • Penggunaan key untuk mengakses Google Map API.  Ternyata key ini kalau ganti komputer harus dibuat lagi. Lalu saat publish jangan lupa diletakkan juga di /res/release.   Jika menggunakan Google Play App Signing, jangan lupa SHA1-nya ditambahkan ke key. Sempat panik saat coba app yang di playstore peta-nya blank 😦
  • Splashscreen dengan style tanpa load view, sangat membantu dari sisi user interface daripada user melihat layar kosong.
  • Layout dengan constraint layout mantep, mulai dari HP kecil sampai tablet bisa tetap bagus.
  • Karena ukuran APK saya besar (kena error), maka saya set proguard agar mengecilkan app. Tapi ini punya efek samping fasilitas search tidak jalan. Bug yang luar biasa (hanya error saat jadi APK). Harus tambahkan perkecualian di proguard untuk searchview.
  • Ada masalah penggunaan appcompat, ini saya lupa, tapi kalau tidak salah saat saya mengakses icon. Di HP istri (LG) ini menyebabkan error.
  • Ada beberapa device lokal (Andromax) yang mengalami error. Tapi karena saya tidak punya devicenya, masih belum bisa didebug.
  • Alpha dan beta test bisa dilakukan di playstore, tapi belum jelas caranya seperti apa.

 

Produk Digital

30 June 2017 at 23:34 | Posted in Uncategorized | Leave a comment

Saat ini kita  dapat melihat bagaimana kemampuan anak sampai dengan remaja mengkonsumsi produk digital. Mulai dari film, game, berita  sampai sosial media.  Jika itu dihilangkan dapat dipastikan mereka akan gelisah. Mereka lebih memilih akses internet daripada membeli barang seperti baju dan berwisata. Apakah mereka merasa tertekan dan sedih?  Kalau ditanya, biasanya mereka merasa cukup puas dan bahagia. Produk digital sudah memenuhi semua kebutuhan mereka (diluar sandang-pangan-papan).  Bagi mereka produk digital sudah seperti candu.

Generasi tipe ini hanya mengkonsumsi tapi sangat sedikit memproduksi.  Tidak ada masalah keseimbangan karena  produk digital sekali dibuat dapat direplikasi ribuan bahkan jutaan kali nyaris tanpa biaya. Satu orang bisa memproduksi belasan film di Youtube yang kemudian ditonton ratusan ribu orang.

Pergeseran ini juga terjadi di dunia kerja, perusahaan dengan puluhan pekerja bisa mempunyai pelanggan sampai jutaan orang. Tahun 2014, Whatsapp hanya memiliki 55 pegawai saat dibeli Facebook seharga 19 Milyar USD  (250 Triliun rupiah) dan sudah memiliki pengguna sebanyak 420 juta. Perkembangan kecerdasan buatan (AI) juga mengancam akan  menggantikan pekerjaan yang tadinya dianggap aman dari otomatisasi.

Menurut saya, di masa depan, masyarakat akan terbagi jadi dua kelompok. Ada kelompok minoritas yang punya kemampuan sangat tinggi dan sangat produktif dala menghasilkan produk digital dan di sisi lain kelompok mayoritas yang pasif dan hanya mengkonsumsi.  Bisa dipastikan kelompok minoritas akan memiliki kekayaan dan pengaruh lebih besar.

Ada dua pendekatan  untuk mengatasi kesenjangan ini. Pertama, dengan mempersiapkan sebanyak mungkin orang untuk bisa menghasilkan produk digital. Misalnya dengan pengenalan tentang ilmu komputasi untuk siswa SD-SMA dan materi elearning gratis seperti MOOC.  Kedua, dengan transfer kekayaan. Golongan minoritas dengan kekayaan berlimpah mendapat pajak tinggi dan ditransfer ke golongan mayoritas.  Artinya,  berikan uang yang cukup walaupun mereka menganggur  untuk sandang-pangan-papan-internet (hanya cukup, tidak berlebihan) dan biarkan mereka tenggelam dengan mengkonsumsi media digital.  Selama mereka puas, tidak akan terjadi kejahatan dan struktur sosial akan stabil (tidak ada kerusuhan).

Blog baru

30 May 2017 at 21:42 | Posted in Uncategorized | Leave a comment

Akhirnya buat blog resmi di UPI (yudiwibisono.staf.upi.edu)   Posting tentang pemrograman, penelitian, pengajaran dan teknologi akan dilanjutkan di sana. Blog ini tetap akan diisi dengan topik lain seperti keluarga, politik(?) dan lain-lain.

Backend API dengan Python

1 May 2017 at 13:05 | Posted in Uncategorized | Leave a comment

Update: sebaiknya gunakan libray seperti Flask-Restfull. Tutorial saya tentang pengantar Flask+uwsgi+nginx

 

Saat ini saya mulai belajar Python karena Tensorflow (dan beberapa deeplearning framework) menggunakan Python. Lalu kebetulan di kuliah mobile programming saya memberikan tugas besar yang memerlukan backend untuk komunikasi antar app jadi sekalian saja untuk latihan.

Pada tugas mobile programming tersebut mahasiswa diminta membuat app yang mirip Gojek atau Uber tetapi untuk pedagang keliling.  Intinya agar pembeli bisa melihat pedagang keliling yang lewat. Jadi idenya saya akan buat REST  API dengan Python yang dapat digunakan untuk menyimpan dan berbagi  lokasi user (baik pedagang maupun pembeli). Niat utamanya untuk mencoba, niat sampingannya supaya tidak ada mahasiswa yang protes “kok kuliah mobile programming diminta buat backend” hehe.

Untuk server, saya buat droplet DigitalOcean. Bisa saja sih menggunakan server ilkom UPI, cuma gara-gara bulan lalu kena hack jadi males (tepatnya takut utak-atik). Install apache2, mysql, python dan setup Python sebagai CGI tidak susah. Cuma ternyata perlu hati-hati untuk versi python: versi 2.7 dan 3. Saya menggunakan python3, tapi saat install library,  lupa malah menggunakan pip, bukan pip3.  Sempat bingung kok librarynya tidak dikenal padahal sudah diinstall.

Dari sisi bahasa, Python yang menggunakan indentasi, bukan “{” “}” sempat membuat saya salah meletakan code, solusinya saya tambahkan comment seperti “#end for” 🙂 Yang paling susah adalah masalah protokol  HTTP-nya sendiri.  Misal setelah  Content-Type: ..” wajib ada satu baris kosong.  Lalu penanganan error (error 400, 500 dst). Anehnya jarang yang membahas ini, mungkin karena mayoritas menggunakan library seperti Flask? 

Berikut code untuk menyimpan lokasi:

#!/usr/bin/python3

# contoh cara penggunaan:  http://xxxyyy.co.id/updatelokasi.py?tag=yw&userid=123&lat=2.343434&long=1.2423424

import cgi, cgitb
cgitb.enable()

import MySQLdb

form = cgi.FieldStorage()

tag = form.getvalue('tag')
userid = form.getvalue('userid')
lat = form.getvalue('lat')
long = form.getvalue('long')

if (tag==None) or (userid==None) or (lat==None) or (long==None) :
   print ("Status: 400 Bad Request")
   print ("Content-Type: application/json\n")
   print ('{"status":"error parameter tidak lengkap, paramter yg valid adalah userid,tag,lat dan long"}')
   print("")
else:
   tag = cgi.escape(tag)
   #print (tag+":"+userid+":"+lat+":"+long)
   db = MySQLdb.connect("localhost","mobprog","mobprogpass","mobprog" )
   cursor = db.cursor()
   sql ="insert into lokasiuser (tag, userid, latitude, longitude) values (%s,%s,%s,%s)";
   try:
      cursor.execute(sql,(tag,userid,lat,long))
      db.commit()
      print ("Status: 200 OK")
      print ("Content-Type: application/json\n")
      print ('{"status":"OK"}')
      print("")
   except:
      db.rollback()
      print ("Status: 500 Internal Error")
      print ("Content-Type: application/json\n")
      print ('{"status":"Error di server, kontak yudi@upi.edu"}')
      print("")

   db.close()

Sedangkan code untuk mengambil lokasi:

#!/usr/bin/python3

# contoh cara penggunaan: http://xxxyyy.co.id/getlokasi.py?tag=yw&userid=123

import cgi, cgitb
cgitb.enable()

import MySQLdb
import json

form = cgi.FieldStorage()

tag = form.getvalue('tag')
userid = form.getvalue('userid')

if (tag==None) or (userid==None) :
   print ("Status: 400 Bad Request")
   print ("Content-Type: application/json\n")
   print ('{"error":"parameter tidak lengkap, paramter yg valid adalah userid dan tag"}')
   print("")
else:
   tag = cgi.escape(tag)
   #print (tag+":"+userid+":"+lat+":"+long)
   db = MySQLdb.connect("localhost","mobprog","mobprogpass","mobprog" )
   cursor = db.cursor()
   sql =" select timestamp, latitude, longitude  from lokasiuser where userid = %s and tag = %s ORDER BY timestamp DESC LIMIT 1"
   try:
      cursor.execute(sql,(userid,tag))
      results = cursor.fetchall()
      #harusnya cuma satu rec
      isAda = False
      for row in results:
         timestamp  = None
         timestamp  = row[0]
         latitude   = row[1]
         longitude  = row[2]
         response={"timestamp":timestamp.isoformat(),"latitude":latitude,"longitude":longitude}
         body = json.dumps(response)
         print ("Status: 200 OK")
         print ("Content-Type: application/json\n")
         print(body)
         print("")
         isAda = True
       #endfor
      if not(isAda) :
         print ("Status: 400 Bad Request")
         print ("Content-Type: application/json\n")
         print ('{"error":"userid atau tag tidak ditemukan"}')
         print("")

   except:
      print ("Status: 500 Internal Error");
      print("Content-Type: text/html\n")
      print('{"error":"server error, kontak yudi@upi.edu"}')
      print("")
   db.close()

 

 

Tutorial Weka Berbahasa Indonesia

28 March 2017 at 08:29 | Posted in Uncategorized | 1 Comment

Weka digunakan pada kuliah Datamining di ilkom UPI. Alasan utama sih karena gratis, open source, dan menggunakan Java sehingga mudah digunakan sebagai library kalau saya membuat program dengan Java (walaupun perlu hati-hati dengan lisensinya yang GPL).

Saya sudah membuat tutorial singkat Weka di:

https://docs.google.com/document/d/12aX-41KJtNqOVo_78ZUzqJGjZbKweZCJAuZgvhZY808/edit?usp=sharing

Lisensinya creative commons jadi bebas digunakan bahkan dimodifkasi, asal nama saya tidak hilang 🙂  Kalau mau format lain (pdf, doc) tinggal pilih File –> Download as.

Cakupan materinya masih terbatas: klasifikasi, clustering, freq itemset mining. Rencananya akan saya tambah pelan-pelan. JIka ada yang mau menyumbang materi  lebih bagus lagi 🙂

Mengapa memilih sekolah favorit?

24 March 2017 at 22:25 | Posted in keluarga, Uncategorized | Leave a comment

Setiap awal penerimaan siswa baru, isu ini selalu muncul. Ada usaha untuk menghilangkan label sekolah favorit, ada juga yang ingin mempertahankan. Saya bukan ahli bidang ini, jadi saya hanya membahas pengalaman saya dan anak.

Saya sendiri masuk SD dengan kualitas yang termasuk rendah, dengan separuh lulusannya tidak melanjutkan ke SMP (putus sekolah). Masuk SMP yang sekarang terbaik di kabupaten Bandung, SMA terbaik di Kota Bandung dan akhirnya masuk prodi dengan passing grade tertinggi se-Indonesia.

Menurut saya, yang membedakan sekolah favorit adalah siswanya. Biasanya siswanya punya karakter rajin dan/atau pintar juga punya motivasi berprestasi tinggi. Alumninya lebih sukses karena memang faktor ini penting saat dewasa nanti.

Keuntungan memilih sekolah favorit?  suasana yang lebih kompetitif. Istilah di atas langit ada langit akan terasa sekali. Kita jadi lebih terpacu untuk menjadi lebih baik lagi. Sekolah favorit juga biasanya memiliki siswa bermasalah lebih sedikit karena sudah terfilter (sulit bagi siswa bermasalah untuk bisa tembus sekolah favorit yang sangat kompetitif masuknya, kecuali dengan cara tidak normal).

Kelemahan memilih sekolah favorit?  suasana yang kompetitif kadang menekan, apalagi di masa remaja yang kepribadiannya belum matang.  Saat kondisi menekan, anak bisa  terpacu, bisa juga jadi  patah semangat kalau tidak kuat. Siswanya juga lebih individualistis, soft skill seperti kemampuan kerjasama, empati jadi kurang berkembang.  Masalah yang lain adalah sekolah favorit malah menjadi magnet siswa yang masuk secara curang. Siswa yang masuk dengan cara curang biasanya punya karakter yang buruk, dan jika jumlahya terlalu banyak justru menghilangkan keunggulan utama sekolah favorit.

Masalah kecurangan ini  membuat saya jauh lebih khawatir saat anak mengikuti penerimaan siswa baru di tingkat SMP dan SMA dibandingkan perguruan tinggi. Anak saya harus bekerja lebih keras untuk bersaing dengan anak lain yang (orang tuanya) menghalalkan semua cara. Di perguruan tinggi yang bagus untungnya masalah ini relatif  tidak ada, kalaupun ada yang masuk dengan cara curang banyak yang kena drop out di tahun-tahun awal.

Berdasarkan pengalaman saya pribadi, beberapa hal yang saya terapkan pada anak:

  1. SD: fokus lebih pada bermain. Jadi cari SD yang tidak perlu kompetitif,  santai dan bisa dicapai dengan jalan kaki. Karena anak saya anak tunggal, kami berusaha agar sebanyak dan sesering mungkin temannya main ke rumah. Untuk memperkuat materi pelajaran, terutama matematika yang sangat penting untuk dasar, kami ikutkan dia dibeberapa les (sempoa, sakamoto, bahasa Inggris, drum). Les bisa disesuaikan waktu, tempat, guru jadi bebannya bisa diatur. Anak saya bersekolah di SD  yang bisa berjalan kaki 10 menit.
  2. SMP:  pada tahap ini anak sudah diberi kebebasan untuk memilih sekolah. Saya cuma menyampaikan bahwa target akhir yang perlu diincar adalah prodi terbaik se Indonesia (apapun prodinya), oleh karena itu perlu pertimbangan yang matang juga. Saya tidak mau anak mengincar SMP terbaik, karena menurut saya di masa SMP anak masih dalam tahap bermain (walaupun tidak sebanyak SD). Tapi belajar dari saya yang terseok-seok saat SMA, maka perlu dicari SMP yang kualitasnya bagus, tapi masih relatif bisa santai. Anak juga didorong untuk aktif dalam berbagai organisasi. Les hanya ikut di kelas 3, untuk mencegah kelelahan. Anak saya masuk SMP1 Bandung walaupun dari nilai UN sebenarnya bisa masuk SMP5.
  3. SMA:  sudah mulai perlu serius dan cari SMA terbaik di kota Bandung. Saya tetap mendorong anak untuk berorganisasi (sayangnya kurang berhasil). Anak saya sekarang  ada di tahap ini (masuk SMA3 Bdg).
  4. Perguruan tinggi,  apapun jurusannya, sebaiknya yang  terbaik di tingkat nasional. Jurusannya sendiri saya bebaskan. Untuk alternatif kuliah di luar negeri, saya lebih suka nanti saja saat S2, walaupun  memang kalau anaknya mau ya silahkan saja. Masalahnya kepribadian anak belum matang sampai lulus S1, masih gampang dipengaruhi lingkungan.

Khusus untuk tingkat perguruan tinggi,  perguruan tinggi favorit juga punya kelebihan dari sisi jejaring alumni.

Next Page »

Blog at WordPress.com.
Entries and comments feeds.