Membandingkan Kesamaan Text dengan Apps Script and Python


Publikasi Dosen suatu instansi pendidikan kadang tidak terekam dengan baik. Sehingga ada kalanya terdapat double input dalam database.

Untuk database yang menggunakan Google Sheet, deteksi kesamaan, sebenarnya dapat menggunakan kode Apps Script berikut:
function hitungKesamaan(source,target)
{
  var src=source.split(" ");
  var trg=target.split(" ");
  var max=(src.length>trg.length)?src.length:trg.length;
  if(max==0)return 0;
  var mrk=[];
  for(var j =0; j < trg.length; j++){
    mrk.push(0);
  }
  var jum=0;
  for(var i =0; i < src.length; i++){
    for(var j =0; j < trg.length; j++){
      if(mrk[j]!=1 && src[i]==trg[j]){
        jum++;
        mrk[j]=1;
        break;
      }
    }
  }
  return jum*100.0/max;
}

Variabel source adalah judul pembanding, dan target adalah judul yang dibandingkan.

Kode ini memberikan hasil nilai balik (return) berupa persentase jumlah kata yang sama antara judul source dan target. Di mana jika memberikan nilai hasil di atas atau sama dengan 60 (yang berarti 60%), sangat dimungkinkan kedua judul adalah penelitian yang sama.

Namun, sayangnya, kode Apps Script di atas sepertinya dijalankan di server, yang akan di matikan, ketika melewati batas timeout yang ditentukan oleh browser.

Selain itu, jika jumlah data yang dibandingkan banyak, prosesnya akan membutuhkan waktu yang lama, bertahap dan membutuhkan sentuhan manual.

Oleh karena itu, diperlukan aplikasi yang dapat menjalankan fungsi di atas secara kontinyu, yang ketika dijalankan, aplikasi dapat mengeksekusi mulai dari awal sampai judul terakhir.

Sebenarnya ada cara untuk membuat fungsi di Apps Script di atas secara paralel, yaitu dengan memanggil fungsi tersebut secara bersamaan menggunakan javascript, melalui browser. Tetapi penulis menghindari cara ini agar tidak dianggap brute force attack oleh Google.

Sehingga desain komunikasi data yang terbayang oleh penulis adalah terdiri dari tiga tahap, yaitu mengambil data dari database, kemudian melakukan prosesi data di PC, dan mengembalikan hasil processing data kembali ke database, yang masing-masing dilakukan secara single step.

Artinya, lama proses perhitungan akan diserahkan ke spesifikasi PC yang digunakan. Semakin tinggi spesifikasi kecepatan processor dan RAM-nya, maka akan semakin cepat pula proses perhitungannya.

Kemudian, karena komunikasi data yang lebih mudah menggunakan struktur data JSON, dan library Java tidak begitu mendukung pada versi Desktop, akhirnya pilihan penulis jatuh pada bahasa Python, sebagai aplikasi versi PC.

Selain mendukung JSON, urllib Python dapat melakukan send and get data, melalui metode POST.

Oleh karena itu, dibutuhkan kode Apps Script yang digunakan untuk mengambil data dalam bentuk JSON dan mengirimkan kembali ke Google Sheets, sebagaimana berikut:
function doPost(e)
{
  var content={};

  //Key Access Apps
  var target = SpreadsheetApp.openById("--id sheet key access");
  var ss=target.getSheetByName("key");

  var keyvalue=ss.getRange("B2").getValue().toString();
  var passed=true;
  if(keyvalue!=e.parameter["keyvalue"]){
    passed=false;
  }

  if(passed){
    var idspreadsheet=(e.parameter["idspreadsheet"]!=null)?e.parameter["idspreadsheet"]:"wkwkwkwkwkwkwkwkwk";
    var sheet=(e.parameter["sheet"]!=null)?e.parameter["sheet"]:"sheet";
    var pointing=(e.parameter["pointing"]!=null)?parseInt(e.parameter["pointing"]):-1;
    var start_row=(e.parameter["row"]!=null)?parseInt(e.parameter["row"]):0;
    var start_column=(e.parameter["column"]!=null)?parseInt(e.parameter["column"]):0;
    var rowlength=(e.parameter["rowlength"]!=null)?parseInt(e.parameter["rowlength"]):-1;
    var columnlength=(e.parameter["columnlength"]!=null)?parseInt(e.parameter["columnlength"]):-1;
    var mode=(e.parameter["mode"]!=null)?parseInt(e.parameter["mode"]):0;
    var raw=(mode==1)?JSON.parse(e.parameter["raw"].toString().replace(/'/g, '"')):null;
   
    target = SpreadsheetApp.openById(idspreadsheet);
    ss=target.getSheetByName(sheet);
    var data;
    content["error"]="";
    if(ss!=null){
      if(mode==0){
        data=ss.getRange(1+start_row,1+start_column,(rowlength<0)?ss.getLastRow():rowlength,(columnlength<0)?ss.getLastColumn():columnlength).getValues().map(function(row){return (pointing>=0)?((row[pointing]!="")?row:null):row}).filter(function(cellData){return cellData != null;});
        if(data!=null)content["data"]=data;
        else content["error"]="Data is empty!";
      }else{
        if(raw!=null && raw.length>0 && raw[0].length){
          ss.getRange(1+start_row,1+start_column,raw.length,raw[0].length).setValues(raw);
        }else{
          passed=false;
          content["error"]="Raw data is Null";
        }  
      }
    }else{
      passed=false;
      content["error"]="Sheet is null";
    }
  }else{    
    content["error"]="Data not found!";
  }

  if(passed){
    content["status"]=1;
  }else{
    content["status"]=0;
  }

  var JSONString = JSON.stringify(content);  
  var JSONOutput = ContentService.createTextOutput(JSONString).setMimeType(ContentService.MimeType.JSON);
  return JSONOutput;
}

Variabel key access, pada kode di atas, penulis gunakan sebagai proteksi sederhana komunikasi data antara aplikasi PC dan Google Sheets.

Bagaimanapun juga, keamanan perlu dipikirkan juga. Jika suatu hari nanti key access telah berhasil di hack misalnya, tinggal mengganti saja key-nya dengan susunan karakter random lain. Atau yang lebih advance, dapat dibuatkan fungsi generate random otomatis, untuk mengubah value key access secara berkala.

Untuk tampilan Google Sheets Key Access adalah seperti gambar dibawah ini:

Sedangkan kode Python yang penulis gunakan sebagai aplikasi PC, untuk memanggil dan mengolahnya, kurang lebih sebagaimana berikut:
from urllib import request, parse
import json

def hitungkesamaan(source,target):
    src=source.split(" ")
    trg=target.split(" ")
    s=len(src)
    t=len(trg)
    maximum=s
    if(t>s):
        maximum=t
    mrk=[0]*len(trg)
    jum=0
    for si in range(len(src)):
        for sj in range(len(trg)):
            if mrk[sj]!=1 and src[si].lower()==trg[sj].lower():
                jum+=1
                mrk[sj]=1
                break
                
    return (jum*100.0/maximum)

def senddingdata(sheet,mode,datum):
    data = { "keyvalue":"1uhfbtroGBDE345HGFterds5tjndj","idspreadsheet":"idsheetdatapublikasi","sheet":sheet,"pointing":0,"row":0,"column":0,"rowlength":-1,"columnlength":-1,"mode":mode,"raw":datum}
    req =  request.Request("https://script.google.com/macros/s/AKfycbzMt3HCgt4aMTZUSK/exec",parse.urlencode(data).encode())
    response = request.urlopen(req)
    return json.loads(response.read())

data_json=senddingdata("Publikasi",0,None)

senddata=[]
for i in range(1,len(data_json["data"])):
    for j in range(i+1,len(data_json["data"])):
        a=hitungkesamaan(data_json["data"][i][2],data_json["data"][j][2])
        if a>59:
            senddata.append([data_json["data"][i][2],data_json["data"][j][2],a])

data_json=senddingdata("Cek Sama",1,senddata)
print(data_json["status"]," ",data_json["error"])
Tampilan Google Sheets Publikasi adalah sebagaimana gambar di bawah ini:



Skema kerja kode Python ini adalah mengambil data di Sheet Publikasi, membandingkan judul, lalu mengembalikan hasil perhitungannya ke Sheet Cek Sama.

Hasil eksekusi menunjukkan, dibanding menggunakan Apps Script langsung, dengan aplikasi Python, proses perbandingan judul menjadi 10 kali lebih cepat.

Sebenarnya penulis kurang menyetujui menggunakan Python, namun karena pekerjaan membutuhkan eksekusi yang harus cepat selesai, maka mau tidak mau, penulis harus menggunakan Python untuk analisa data di atas.

Komentar



Postingan populer dari blog ini

Kumpulan Source Code Greenfoot

Algorithma Coretan Abstrak dengan HTML5 Canvas

Game TicTacToe dengan Greenfoot

Cara Membuat Halaman HTML Sederhana

Kode Greenfoot Game Snake Sederhana

Honeycomb Style Wallpaper dengan HTML5 Canvas

Ganti Kartu ATM BNI yang Rusak

Tips Agar Website Anda Segera di Terima oleh Google Adsense dan di-Monetize

Selamatan Latar Glundengan Bubuk Banyuwangi

Menggunakan JSON di Netbeans 8.2