purwadhika-logopurwadhika-logo

Membangun API dengan Flask untuk Konsumsi Model Machine Learning: Panduan Langkah demi Langkah

Fadhel Ijlal Falah

26 March 2024

Membangun API dengan Flask untuk Konsumsi Model Machine Learning Panduan Langkah demi Langkah.jpg

Flask, sebuah framework web mikro untuk Python, telah menjadi pilihan populer untuk membangun aplikasi web ringan dan API. Seiring dengan kemajuan teknologi Machine Learning (ML), kini kita dapat mengintegrasikan model ML ke dalam API menggunakan Flask. Artikel ini akan memberikan panduan langkah demi langkah dalam membuat API dengan Flask yang mengkonsumsi model ML.

Apa Itu Flask dan API?

Flask:

Flask adalah framework web Python yang sederhana, ringan, dan mudah digunakan. Dikenal sebagai "micro" karena dirancang untuk menjadi minimalis dan memungkinkan pengembang untuk memilih dan mengintegrasikan komponen sesuai kebutuhan proyek. Flask memberikan keleluasaan dalam membangun aplikasi web dari yang sederhana hingga kompleks.

API (Application Programming Interface):

API adalah sekumpulan aturan dan alat komunikasi antara dua atau lebih perangkat lunak. Dalam konteks web, API digunakan untuk memungkinkan berbagai aplikasi berkomunikasi dan berbagi data. API memungkinkan integrasi yang mulus antara berbagai sistem dan platform.

Metode API pada Flask: GET, POST, DELETE, PUT

Sebelum kita memulai, penting untuk memahami empat metode dasar yang umum digunakan dalam pengembangan API: GET, POST, DELETE, dan PUT.

GET:

Metode ini digunakan untuk mengambil data dari server. Misalnya, jika Anda memiliki API endpoint "/users" dengan metode GET, permintaan ke endpoint tersebut akan mengembalikan daftar pengguna.

POST:

Metode POST digunakan untuk mengirim data baru ke server. Jika Anda memiliki API endpoint "/users" dengan metode POST, Anda dapat membuat pengguna baru dengan mengirim data pengguna dalam permintaan.

DELETE:

Metode DELETE digunakan untuk menghapus data dari server. Misalnya, dengan API endpoint "/users/{id}" dengan metode DELETE, Anda dapat menghapus pengguna berdasarkan ID.

PUT:

Metode PUT digunakan untuk memperbarui data yang sudah ada di server. Jika Anda memiliki API endpoint "/users/{id}" dengan metode PUT, Anda dapat memperbarui informasi pengguna berdasarkan ID.

Langkah-langkah Membangun API dengan Flask yang Mengkonsumsi Model ML

Instalasi Flask:

Pastikan Anda telah menginstal Flask. Jika belum, gunakan perintah pip berikut:

pip install flask

Persiapkan Model:

Pastikan Anda memiliki model yang telah dilatih dan disimpan dalam format pickle. Gantilah 'model.pkl' dengan model Anda dan pastikan struktur direktori proyek Anda sesuai.

Buat File Preprocessing (Opsional):

Buat file preprocessing.py yang berisi implementasi kelas Preprocessing untuk melakukan tahap-tahap preprocessing pada teks.

import re import pandas as pd from string import punctuation from Sastrawi.Stemmer.StemmerFactory import StemmerFactory

class Preprocessing : def init(self): print("Initializing preprocessing...") self.factory = StemmerFactory() self.stemmer = self.factory.create_stemmer() pass

def processtext(self, text): text = text.lower() text = re.sub(r'&\w*;', '', text) text = re.sub('@[^\s]+','',text) text = re.sub(r'$\w*', '', text) text = text.lower() text = re.sub(r'https?://./\w', '', text) text = re.sub(r'#\w*', '', text) text = re.sub(r'[' + punctuation.replace('@', '') + ']+', ' ', text) text = re.sub(r'\b\w{1,2}\b', '', text) text = re.sub(r'\s\s+', ' ', text) text = text.lstrip(' ') text = ''.join(c for c in text if c <= '\uFFFF') return text

def stem(self, text): text = self.stemmer.stem(text) return text

def remove_stopwords(self, param): f = "id_stopwords.txt" with open(f, 'r') as my_stopwords: stopwords_list = my_stopwords.read() list = param.split() index = [] i = 0 d = "" while i < len(list): if list[i] not in stopwords_list: index.append(i) i += 1 for k in index: d += list[k]+" " #s = ' '.join(list) return d.strip()

Konstruktor init:

def init(self): print("Initializing preprocessing...") self.factory = StemmerFactory() self.stemmer = self.factory.create_stemmer()

  • Konstruktor inisialisasi objek Preprocessing.
  • Membuat objek Stemmer dari library Sastrawi untuk proses stemming pada teks.

Metode processtext:

def processtext(self, text): text = text.lower() text = re.sub(r'&\w*;', '', text) text = re.sub('@[^\s]+','',text) text = re.sub(r'$\w*', '', text) text = text.lower() text = re.sub(r'https?://./\w', '', text) text = re.sub(r'#\w*', '', text) text = re.sub(r'[' + punctuation.replace('@', '') + ']+', ' ', text) text = re.sub(r'\b\w{1,2}\b', '', text) text = re.sub(r'\s\s+', ' ', text) text = text.lstrip(' ') text = ''.join(c for c in text if c <= '\uFFFF') return text

  • Metode ini melakukan serangkaian operasi pengolahan teks:
  • Mengonversi teks menjadi huruf kecil (lowercase).
  • Menghapus HTML entities.
  • Menghapus mention (tag '@username').
  • Menghapus tanda dollar.
  • Menghapus URL.
  • Menghapus hashtag.
  • Menghapus tanda baca (punctuation).
  • Menghapus kata dengan panjang kurang dari atau sama dengan 2 karakter.
  • Menghapus spasi berlebihan.
  • Menghapus spasi di awal teks.
  • Menghapus karakter di luar Unicode (di atas '\uFFFF').

Metode stem:

def stem(self, text): text = self.stemmer.stem(text) return text

  • Metode ini menggunakan stemmer Sastrawi untuk melakukan stemming pada teks.

Metode remove_stopwords:

def remove_stopwords(self, param): f = "id_stopwords.txt" with open(f, 'r') as my_stopwords: stopwords_list = my_stopwords.read() list = param.split() index = [] i = 0 d = "" while i < len(list): if list[i] not in stopwords_list: index.append(i) i += 1 for k in index: d += list[k]+" " return d.strip()

  • Metode ini menghapus stopwords (kata-kata umum yang sering muncul dan dianggap tidak memberikan informasi signifikan).
  • Membaca stopwords dari file id_stopwords.txt.
  • Membuat list kata dari parameter.
  • Mengambil index kata yang bukan stopwords.
  • Menggabungkan kata-kata tersebut dan mengembalikan teks yang telah dihilangkan stopwords.

Implementasikan API Flask:

isi file app.py dengan implementasi API Flask.

from flask import Flask, request, jsonify, make_response from preprocessing import Preprocessing import pickle

app = Flask(name)

response = { 'status': 200, 'msg': 'success', 'data': [] }

@app.post('/predict') def predict(): try: # Lakukan prediksi menggunakan model ML filename = 'model.pkl' model = pickle.load(open(filename, 'rb')) dp = Preprocessing() data = request.get_json() value = dp.stem(data['text']) value = dp.remove_stopwords(value) h = model.predict([value]) if not h[0]: response['data'] = 'Negatif review' else: response['data'] = 'Positif review' except Exception as e: response['status'] = 500 response['msg'] = str(e) return make_response(jsonify(response), 200)

if name == 'main': app.run(debug=True, port=3000)

Import Libraries:

from flask import Flask, request, jsonify, make_response from preprocessing import Preprocessing import pickle

  • Mengimpor kelas Flask dari library Flask untuk membuat aplikasi web.
  • Mengimpor modul request, jsonify, dan make_response dari Flask untuk menangani permintaan HTTP dan meresponsnya.
  • Mengimpor kelas Preprocessing untuk melakukan tahap-tahap preprocessing pada teks.
  • Mengimpor modul pickle untuk membaca model Machine Learning yang telah disimpan dalam format pickle.

Inisialisasi Aplikasi Flask dan Respons Awal:

app = Flask(name)

response = { 'status': 200, 'msg': 'success', 'data': [] }

  • Membuat objek Flask dengan nama aplikasi app.
  • Menginisialisasi respons awal yang akan dikirimkan setiap kali endpoint /predict diakses.

Endpoint /predict dengan Metode POST:

@app.post('/predict') def predict():

  • Membuat endpoint /predict dengan metode POST. Endpoint ini digunakan untuk melakukan prediksi sentimen pada teks yang dikirimkan.

Melakukan Prediksi:

try: # Lakukan prediksi menggunakan model ML filename = 'model.pkl' model = pickle.load(open(filename, 'rb')) dp = Preprocessing() data = request.get_json() value = dp.stem(data['text']) value = dp.remove_stopwords(value) h = model.predict([value]) if not h[0]: response['data'] = 'Negatif review' else: response['data'] = 'Positif review'

  • Mencoba melakukan prediksi sentimen dengan menggunakan model Machine Learning yang telah di-load dari file model.pkl.
  • Menggunakan kelas Preprocessing untuk melakukan tahap preprocessing pada teks yang diterima.
  • Menentukan hasil prediksi sentimen berdasarkan output model. Jika hasilnya negatif (not h[0]), maka respons data akan diisi dengan 'Negatif review', dan sebaliknya.

Exception Handling:

except Exception as e: response['status'] = 500 response['msg'] = str(e)

  • Menangkap exception jika terjadi kesalahan selama proses prediksi atau eksekusi kode lainnya.
  • Mengatur status respons menjadi 500 (Internal Server Error) dan menyertakan pesan kesalahan dalam respons.

Membuat dan Mengirimkan Respons JSON:

return make_response(jsonify(response), 200)

  • Menggunakan make_response dan jsonify untuk membuat respons dalam format JSON.
  • Mengirimkan respons JSON dengan status 200 (OK) ke pengguna yang melakukan permintaan.

Menjalankan Aplikasi Flask:

Jalankan aplikasi Flask dengan perintah berikut di terminal:

python app.py

API akan berjalan di http://127.0.0.1:3000/ secara default.

Testing API Menggunakan Postman:

  • Buka Postman atau unduh dan instal aplikasinya jika belum.
  • Pilih “New” (di sebelah tombol import), lalu pilih “Http”.

Testing API Menggunakan Postman 1.png

  • Buat permintaan POST baru ke endpoint http://127.0.0.1:3000/predict.
  • Pilih tab "Body" dan pilih format "JSON (application/json)".
  • Masukkan payload JSON contoh, misalnya:

{ "text": "ini bagus sekali" }

  • Klik tombol "Send" untuk mengirim permintaan.
  • Periksa respons yang diterima dari API untuk melihat prediksi sentimen.

Testing API Menggunakan Postman 2.png

Dengan langkah-langkah di atas, Anda telah berhasil membuat API Flask untuk melakukan analisis sentimen pada teks dan telah menguji fungsionalitasnya menggunakan Postman. Pastikan untuk mengganti payload JSON dengan teks yang ingin Anda uji untuk mendapatkan hasil prediksi sentimen. Selamat mencoba!

Untuk link project ini kalian dapat mengunduhnya melalui link github saya di sini.


bagikan