|
|
| 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 *
|
|
|
|
|
| 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'")
|
|
|
|
|
|
|
| st.cache(allow_output_mutation=True)
|
| def knn_malaya():
|
| load_model = pickle.load(open('knn_malaya.sav', 'rb'))
|
| return load_model
|
|
|
|
|
|
|
| st.cache(allow_output_mutation=True)
|
| def tukar_kata(kata):
|
|
|
| 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)
|
|
|
|
|
| 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})
|
|
|
|
|
|
|
| kelas = knn_malaya()
|
| hasil = kelas.predict(string2)
|
|
|
|
|
| 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")
|
|
|
|
|
| output = pd.DataFrame({"kata" : string1, "entiti" : fin})
|
| return output
|
|
|
|
|
| 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()
|
|
|
|
|
| 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("##")
|
| df_test = pd.DataFrame()
|
| if btn_model == 'KNN':
|
| df_test = tukar_kata(kata)
|
|
|
|
|
|
|
| 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'}))
|
|
|
|
|
| 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))
|
| 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))
|
|
|
|
|
| |