Friday, January 29, 2016

String Similarity menggunakan UDF pada HIVE

Seorang nasabah Bank Mandiri bernama Anto Febrianto selalu mentranfer uangnya ke BCA setiap bulan dengan nama AntoFebriant. Dari dua nama tersebut kita mungkin bisa dengan mudah memahami keduanya adalah orang yang sama. Bagaimana caranya agar sistem dapat mengetaui kalau itu adalah orang yang sama dengan cepat pada ratusan juta record transaksi setiap bulan? Hal ini dapat dilakukan dengan pengembangan teknik Levenshtein Distance. Silahkan cek wikipedia untuk mengenal Levenshtein Distance. Topik yang saya bahas disini adalah bagaimana menggunakan Leveshtein Distance untuk menyelesaikan masalah nyata di lapangan.

Hal yang perlu diperhatikan adalah sebagai berikut:
  1. Levenshtein Distance dari dua kata yang identik adalah 0. Misalnya PERTAMINA dan PERTAMINA memiliki distance 0 karena sama. Apabila kita bandingkan antara PERTAMINA dengan PERTAMINI nilainya adalah 1 karena ada satu karakter yang berbeda.
  2. Dari nilai yang obsolut diatas, tidak ada kejelasan kapan kita bisa yakin bahwa dua kalimat tertentu adalah sama meskipun distance-nya adalah 4. Kita harus mengubahnya ke dalam persentase sehingga bisa lebih intuitive menentukan treshold kesamaan dua nama.
  3. Beberapa stop word (kata tidak penting) harus dihapus. Pada kasus perbankan, kata kata seperti PT, Persero, Tbk, Sdr. Mrs. Ny. Tn. harus dihapus karena attribute yang tidak bisa membedakan antara nasabah yang satu dengan yang lain.

Berikut kodenya:

package com.anto.udfprm;

import java.util.HashMap;
import java.util.Map;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.io.Text;

public class _antoUDFLevenshtein extends UDF {
  public Float evaluate(Text s1, Text s2) throws HiveException{
    if (s1 == null || s2 == null) {
      return null;
    }
    return computeLevenshteinDistance(s1.toString(), s2.toString());
  }

  private static int minimum(int a, int b, int c) {
    if (a<=b && a<=c)
      return a;
    if (b<=a && b<=c)
     return b;
    return c;
  }
    
  private static float computeLevenshteinDistance(String s1, String s2) {
    //kumpulkan daftar stop word
 String stopword="SERVIS|SERVICE|HOLDING|GROUP|LEASING|(T\\.?B\\.?K\\.?)|PERSR|PERSERO|(L\\.?T\\.?D\\.?)|(P\\.?T\\.?E\\.?)|(C\\.?V\\.?)|(P\\.?T\\.?)|\\d\\d\\d*|[\\_\\-\\*\\&\\^\\%\\$\\#\\@\\(\\)\\+\\=\\`\\~\\,\\.\\/\\<\\>\"\']";
    String s1String= s1.toString().toUpperCase().replaceAll(stopword, " ");
    
    //atur spasi dan susun rapi nama standard yang baru
    String[] s1_ins= s1String.split(" ");
    String s1_new="";
 for (String s1_in: s1_ins) {
  if (s1_in.trim().length()!=0) {
   s1_new = s1_new + " "+(s1_in).trim();
  }
 }
 s1_new= s1_new.trim();
 
 String s2String= s2.toString().toUpperCase().replaceAll(stopword, " ");
 String[] s2_ins= s2String.split(" ");
 String s2_new="";
 for (String s2_in: s2_ins) {
  if (s2_in.trim().length()!=0) {
   s2_new = s2_new + " "+(s2_in).trim();
  }
 }
 s2_new= s2_new.trim();
 
 //Ubah huruf romawi jadi angka
 Map romawi= new HashMap();
 romawi.put("I", "1"); romawi.put("II", "2"); romawi.put("III", "3"); romawi.put("IV", "4"); romawi.put("V", "5");
 romawi.put("VI", "6"); romawi.put("VII", "7"); romawi.put("VIII", "8"); romawi.put("IX", "9"); romawi.put("X", "10");
 romawi.put("XI", "11"); romawi.put("XII", "12"); romawi.put("XIII", "13"); romawi.put("XIV", "14"); romawi.put("XV", "15");
 romawi.put("XVI", "16"); romawi.put("XVII", "17"); romawi.put("XVIII", "18"); romawi.put("XIX", "19"); romawi.put("XX", "20");
    
 s1_ins= s1_new.split(" ");
    int len= s1_ins.length-1;
    s1_new="";
    int n=0;
 for (String s1_in: s1_ins) {
  if (n==len){
   if (romawi.containsKey(s1_in.trim())){
    s1_new = s1_new + " "+romawi.get(s1_in.trim());
   } else {
    s1_new = s1_new + " "+(s1_in).trim();
   }
  } else {
   s1_new = s1_new + " "+(s1_in).trim();
  }
  n++;
 }
 s1_new= s1_new.trim();
    
 s2_ins= s2_new.split(" ");
    len= s2_ins.length-1;
    s2_new="";
    n=0;
 for (String s2_in: s2_ins) {
  if (n==len){
   if (romawi.containsKey(s2_in.trim())){
    s2_new = s2_new + " "+romawi.get(s2_in.trim());
   } else {
    s2_new = s2_new + " "+(s2_in).trim();
   }
  } else {
   s2_new = s2_new + " "+(s2_in).trim();
  }
  n++;
 }
 s2_new= s2_new.trim();
  
 char[] str1= s1_new.toCharArray();
 char[] str2= s2_new.toCharArray();
 
    int[][] distance = new int[str1.length+1][];

    for(int i=0; i<=str1.length; i++) {
      distance[i] = new int[str2.length+1];
      distance[i][0] = i;
    }

    for(int j=0; j=lenstr2) {
     if (lenstr1>dist){
      return (lenstr1 - dist)/lenstr1;
     } else {
         return 0; 
     }
    } else {
     if (lenstr2>dist){
      return ((lenstr2 - dist)/lenstr2);
     } else {
      return 0;
     }
    }
  } 
}


Kode tersebut dipaket ke dalam Jar kemudian diupload ke hadoop melalui Hue.

Setelah itu, fungsi di buat pada hive.



Selanjutnya diuji,


Demikian, kita sudah bisa membuat fungsi UDF pada hive dan membuat kasus menarik untuk Big Data yakni String Similarity.


Sains dibelakang Big Data Analitik

Sains dibelakang Big Data Analitik berbicara mengenai algoritma apa yang digunakan untuk kasus apa. Tidak semua sainsnya dapat diterapkan untuk semua kasus, misalnya pada Twitter apabila kita berbicara mengenai trending, analysisnya lebih pada analisis time series (contoh temporal analysis) sementara bila kita bicara mengenai sentimen posting, analysisnya lebih pada analysis classification (contoh naive bayes). Umumnya mata kuliah sains ini dipelajari pada jurusan statistik dan ilmu komputer. Mata kuliah tersebut diantaranya artificial intelligence, data mining, information retrieval, dan statistics inference.

Untuk memudahkan pemahaman sains ini, saya akan mengambil contoh penggunakan naive bayes dalam klasifikasi kalimat. Contoh ini dapat dikembangkan untuk tujuan lainnya seperti mengukur sentimen tweet di Twitter. Contoh ini saya ambil dari link Stanford NLP (Natural Language Processing) website.



Dari gambar diatas terlihat dari semua training data terdapat 3 record dengan klasifikasi c dan 1 record dengan klasifikasi j (atau bukan c). Berdasarkan data training tersebut (yang secara teoritiknya diambil secara random) kita dapatkan:

Prior Probability:
Probabilitas dokumen dengan klasifikasi c atau P(c) = 3/4
Probabilitas dokumen dengan klasifikasi bukan c atau P(j) = 1/4

Jumlah kata unique dalam semua kalimat training diatas adalah 6

Sekarang kita lihat Testing data yang terdiri dari kata Chinese Chinese Chinese Tokyo Japan. Kita hitung probabilitas tiap kata tersebut satu persatu.

Probability kata Chinese pada saat kategorynya c
P(Chinese|c) = (5 + 1)/(8+ 6) = 6/14 atau 3/7

5 berasal dari lima kali kata chinese muncul pada saat klasifikasi c
1 adalah digunakan untuk normalisasi pembilang
8 berasal dari jumlah semua kata pada saat klasifikasi c
6 berasal dari jumlah semua kata unik pada training data

Seterusnya untuk semua istilah kita dapatkan
P(Tokyo|c)      = P(Japan|c) = (0 + 1)/(8+ 6) = 1/14 
P(Chinese|j)    = (1 + 1)/(3+ 6) = 2/9
P(Tokyo|j)       = P(Japan|j) = (1 + 1)/(3+ 6) = 2/9

Jadi berapa probability Chinese Chinese Chinese Tokyo Japan untuk c dan j?
P(c|test data) = 3/4 * (3/7)*(3/7)*(3/7) * (1/14)*(1/14) = 0.0003
P(j|test data) = 1/4 * (2/9)*(2/9)*(2/9) * (2/9)*(2/9)= 0.0001

Terlihat disana kalau kalimat baru basuk ke dalam klasifikasi c.

Untuk mudahnya silahkan lihat video berikut:



Naive Bayes hanyalah salah satu contoh dari sekian banyak sains pada Big Data Analytics. Beberapa lainnya seperti Neural Network dan Logistic Regression. 


Reference: Stanford NLP


Wednesday, January 27, 2016

Memahami Perbedaan Big Data dan Data Warehouse

Hal pertama yang sering kita dengar tentang perbedaan Big Data dengan Data Warehouse (DWH) adalah Big Data untuk data tak terstruktur seperti percakapan di twitter sedangkan DWH untuk data terstruktur seperti record rekening bank Anda. Pernyataan ini sebenarnya tidak sepenuhnya benar karena Big Data juga bisa menangani data terstruktur sedangkan DWH juga bisa diinput dengan data tak terstruktur (seperti BLOB). Untuk lebih lengkapnya, berikut perbandingan Big Data dan DWH:
  1. Big Data teroptimasi untuk mengolah data tak terstruktur. File dalam HDFS atau hadoop secara sederhana seperti file yang kita miliki dalam folder windows explorer atau handphone. Kita bisa menaruh file apapun di dalamnya seperti file foto, video, dan lain-lain. Itulah maksudnya teroptimasi untuk data tak terstruktur. Dilain pihak, DWH justru teroptimasi untuk data terstruktur seperti tabel. Pada data terstruktur, tipe data terdefinisi dengan jelas misalnya nama orang bertipe varchar dengan ukuran 50 karakter. Selain itu secara default terdapat primary key untuk menjaga keunikan seluruh data. 
    Stream Twitter yang tersimpan didalam Hadoop dilihat menggunakan Hue. Seperti terlihat diatas, stream twitter yang berformat JSON tidak akan mudah diolah dengan RDBMS. Dilain pihak, Hive pada Big Data dapat mengolah data tersebut dengan mudah.
  2. Schema on the fly atau sederhananya "schema tabel belakangan saja". Ketika kita melakukan memasukkan data dan memanipulasinya di RDBMS, kita harus mempertimbangkan schema data dari awal. Misalnya apakah nomor kartu kredit disimpan sebagai bilangan integer atau karakter string. Keputusan pemilihan ini harus konsisten untuk setiap table karena berpengaruh ketika analysis memerlukan operasi join beberapa tabel. Hal tersebut tidak berlaku pada Big Data. Schema dapat diset dan diubah belakangan
Bagaimana dengan ukuran data? Perbedaannya adalah bagaimana teknologi Big Data (Hadoop related) menangani data berukuran besar. Big Data memang dari awal didesain untuk bisa menangani data berukuran besar dengan mendistribusikan data tersebut ke banyak server. Ketika server-server tersebut penuh, kita bisa menambahkan server baru (node) untuk menambah kapasitasnya. Pada DWH hal tersebut tidak dimungkinkan, ketika server melebihi kapasitasnya, kita diharuskan untuk membeli server yang baru yang lebih besar.
Menambahkan Node Baru di Cloudera hanya dengan menggunakan wizard. Node baru bisa digunakan untuk menambah kapasitas Big Data


Wednesday, September 9, 2015

Mengenal Big Data

Big Data adalah istilah umum yang mengacu pada data yang berukuran sangat besar dan komplek sehingga penyimpanan dan pengolahannya dengan aplikasi database tradisional sudah tidak lagi memadai. Pengolahan dengan aplikasi database tradisional ini misalnya adalah pengolahan menggunakan database MySQL, MsSQL dan sejenisnya 1). 
Karena Big Data sering diperbincangkan dengan topic yang luas, seringkali terjadi kesalahan interpretasi mengenai Big Data itu sendiri. Selain itu istilah-istilah "buzzword" dalam artikel-artikel tentang Big Data menambah kebingungan lebih lanjut. Misalnya berita "Big oil turns to big data as oil prices plummet" atau "The Impacts Of Big Data That You May Not Have Heard Of" seolah-olah menyimpulkan Big Data bisa melakukan apa saja dan kalau perusahaan Anda mengimplementasikannya atau perusahaan Anda akan bisa sama berhasilnya dengan perusahaan-perusahaaan di dalam artikel tersebut. Sebenarnya tidak sesederhana itu. Untuk lebih mudahnya kita dapat membagi Big Data ke dalam beberapa topik berikut:
  1. Big Data Technology
    • Dalam hal ini teknologi dari Big Data tersebut. Hal terpenting disini adalah pemahaman perbedaan Big Data dengan Database Traditional (DWH: Data Warehouse), kelebihan dan kekurangan masing-masing. Dalam big data technology kita berbicara mengenai hardware dan software yang bisa digunakan untuk menyimpan, mengolah, dan menganalysis data. Teknik yang populer sekarang adalah penyimpanan berbasis Hadoop dan komputasi menggunakan Map Reduce (Yarn). 
  2. Big Data Science (and Analytics)
    • Apabila perusahaan menggunakan Big Data untuk melakukan fungsi-fungsi yang selama ini dilakukan oleh DWH (dan ETL Platform), Big Data dalam hal ini tak lebih sebagai pengganti atau pelengkap DWH itu sendiri. Big Data Science berbicara mengenai algoritma yang digunakan untuk memecahkan masalah tertentu, misalnya menentukan apakah nama Anto Febrianto adalah nama seorang laki-laki atau perempuan? Menggunakan teknik klasifikasi seperti naive bayes, hal tersebut dapat dipecahkan dengan mudah.   
  3. Big Data Cases
    • Misalnya one on one campaign oleh Bank ke nasabahnya melalui email, sms, dan sosial media. Bank mengirimkan promosi belanja tertentu berdasarkan profile nasabah yang terdapat di Bank digabungkan dengan data pada Twitter atau Facebook mereka. Terlihat disini Big Data Case meliputi pemilihan teknologi dan pemilihan algoritma yang sesuai. Pada Big Data Case kita bicara mengenai implementasi big data secara real dilapangan
  4. Big Data Visualization
    • Data mesti dapat diolah dan ditampilkan secara intuitive. Disini terdapat peran aplikasi yang bisa mengexplore Big Data agar didapatkan kesimpulan yang berguna. Beberapa teknik visualisasi yang digunakan misalnya network analysis friendship di facebook untuk melihat siapa yang paling berpengaruh dalam group.

1)   Perusahaan - perusahaan database traditional ada juga yang memilki product Big Data versi mereka sendiri