hugpickle / app.py
Arifsyamil
Create app.py
3c27d7e unverified
#Import all neccessary libraries
import streamlit as st
import re
import wikipediaapi
import malaya
import torch
import tensorflow
import pandas as pd
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.multioutput import MultiOutputClassifier
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
import numpy as np
import matplotlib.pyplot as plt
import os
import psutil
import pickle
from malaya_file import *
#Page header, title
st.set_page_config(page_title= "Malay Named Entity Recognition (NER) Model", page_icon= ":book:", layout= "wide")
st.title(":book: Pengecaman Entiti Nama Malay (NER) model")
st.markdown("CARA MENGGUNAKAN PROGRAM")
st.markdown("1. Sila taip sebuah ayat atau teks tidak melebihi 500 karakter di ruangan bawah")
st.markdown("2. Pilih model untuk melakukan proses pengecaman entiti nama (NER) berdasarkan teks")
st.markdown("3. Klik butang 'BUAT RAMALAN' bagi memulakan program")
st.markdown("4. Paparan bagi setiap kata serta jenis entiti akan dipaparkan pada bahagian 'HASIL RAMALAN'")
#LOAD MODEL FROM KNN_MALAYA.SAV
st.cache(allow_output_mutation=True)
def knn_malaya():
load_model = pickle.load(open('knn_malaya.sav', 'rb'))
return load_model
#CHANGE STRING INTO LABELENCODER DATAFRAME
#PREDICT WORD OUTSIDE DATA
st.cache(allow_output_mutation=True)
def tukar_kata(kata):
#global kelas, output
global output
string = re.sub("[=(),:;.]", "", kata)
string1 = string.split(" ")
string2 = pd.DataFrame(string1, columns = ["LKATA"])
string2['LSEBELUM'] = string2['LKATA'].shift(1)
string2['LSELEPAS'] = string2['LKATA'].shift(-1)
string2.fillna("null", inplace=True)
#string1
#st.table(string1[:10])
lbl = LabelEncoder()
lbl_sen = lbl.fit_transform(string2['LKATA'])
lbl_bef = lbl.fit_transform(string2['LSEBELUM'])
lbl_aft = lbl.fit_transform(string2['LSELEPAS'])
string2 = pd.DataFrame({'LKATA':lbl_sen, 'LSEBELUM': lbl_bef, 'LSELEPAS' : lbl_aft})
#st.dataframe(string2.head())
#Using classifier.predict() from load_model from knn_malaya.sav
kelas = knn_malaya()
hasil = kelas.predict(string2)
#Convert array into entities
fin = []
for z in hasil:
if (z == [1, 0, 0]).all():
fin.append("LOKASI")
elif (z == [0, 1, 0]).all():
fin.append("MANUSIA")
elif (z == [0, 0, 1]).all():
fin.append("ORGANISASI")
else:
fin.append("LAIN-LAIN")
#global perkata, output
#perkata = [(key, value) for i, (key, value) in enumerate(zip(string1, fin))]
output = pd.DataFrame({"kata" : string1, "entiti" : fin})
return output
#CREATE TEXT FORM
with st.form(key= 'my_form'):
global kata, btn_model, df1, df2
kata = st.text_area(label="Sila taip teks atau ayat:", max_chars= 500)
btn_model = st.radio("Pilih model untuk pengecaman entiti nama",
("KNN", "BERT", "Tiny-BERT", "ALBERT", "Tiny-ALBERT", "XLNET", "ALXLNET", "FASTFORMER", "Tiny-FASTFORMER"))
submit_button = st.form_submit_button(label= ":arrow_right: Buat Ramalan")
if submit_button:
if re.sub(r'\s+','',kata)=='':
st.error('Ruangan teks tidak boleh kosong.')
elif re.match(r'\A\s*\w+\s*\Z', kata):
st.error("Teks atau ayat mestilah sekurang-kurangnya dua patah perkataan.")
else:
if btn_model == "KNN":
st.write("Anda pilih model : KNN")
result = knn_malaya()
#st.write(load_model)
#df2 = ramal_kata(kata)
else:
st.write("Anda pilih model transformer: ", btn_model)
st.success("Butang hantar berfungsi!")
with st.container():
st.write("---")
st.header("Hasil Ramalan")
st.subheader("Ayat asal")
st.write("##")
st.write(kata)
patah = str(len(kata.split()))
st.write("Bilangan perkataan : {}".format(patah))
st.write("##")
if btn_model == 'KNN':
df_test = tukar_kata(kata)
#data = {'Name': ['Tom', 'nick', 'krish', 'jack'], 'entiti': [20, 21, 19, 18]}
#df_test = pd.DataFrame(data)
#st.write("LOAD PICKLE IN PROGRESS")
else:
df_test = malaya_model(btn_model, kata)
entiti = sorted(df_test['entiti'].unique())
pilih = st.multiselect('Jenis entiti', entiti, entiti)
df_pilihan = df_test [ (df_test['entiti'].isin(pilih)) ]
df_line = df_pilihan.copy()
st.table(df_line.style.set_properties(**{'background-color': 'white', 'color': 'black'}))
#About model
with st.expander("About this app", expanded=True):
st.write(
"""
- **Pengecaman Nama Entiti Malay** adalah sebuah aplikasi pembelajaran mesin yang dibangunkan bagi mengecam entiti pada setiap token menggunakan modul MALAYA (Husein, 2018)
- Projek ini adalah tugasan Final Year Project bagi Ijazah Sarjana Muda di UKM
- Aplikasi ini ingin menentukan model terbaik yang boleh digunakan bagi dokumen teks subjek sejarah Bahasa Melayu
- Model ini mempunyai 3 fitur utama iaitu kata asal, kata sebelum dan kata selepas. Kelas yang disasarkan ialah LOKASI, MANUSIA dan ORGANISASI
- Maklumat lanjut boleh hubungi Muhd Arif Syamil bin Mohd Rahimi melalui e-mel a177313@siswa.ukm.edu.my atau 012-7049021
""")
process = psutil.Process(os.getpid())
mem_size = str((process.memory_info().rss)) # in bytes, divide by 1 billion to GB
mem_size_mb = str((process.memory_info().rss) / 1000000)
mem_size_gb = str((process.memory_info().rss) / 1000000000)
st.write("Penggunaan memori: {} bytes or {} MB or {} GB".format(mem_size, mem_size_mb, mem_size_gb))
# Dokumen Pemasyhuran Kemerdekaan 1957 telah ditulis dalam dua bahasa iaitu bahasa Melayu yang ditulis dalam Jawi dan bahasa Inggeris - No PERSON, LOCATION, ORGANISATION
# Ketika mendarat di Lapangan Terbang Sungai Besi, tetamu kehormat telah disambut oleh Pesuruhjaya Tinggi British di Tanah Melayu, Sir Donald Charles MacGillivray dan Lady MacGillivray, Yang di-Pertuan Agong Tanah Melayu yang pertama, Tuanku Abdul Rahman diiringi Raja Permaisuri Agong dan Perdana Menteri Tanah Melayu yang pertama, Tunku Abdul Rahman.
# Kedudukan sebuah kereta yang terjunam ke dalam Sungai Maaw di Jeti Feri Tanjung Kunyit, Sibu, semalam, sudah dikenal pasti. Jurucakap Pusat Gerakan Operasi (PGO), Jabatan Bomba dan Penyelamat Malaysia (JBPM) Sarawak, berkata kedudukan Toyota Camry di dasar sungai itu dikesan anggota Pasukan Penyelamat Di Air (PPDA) yang melakukan selaman kelima, hari ini, pada jam 3.49 petang.