Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -6,23 +6,33 @@ import numpy as np
|
|
| 6 |
import faiss
|
| 7 |
from sentence_transformers import SentenceTransformer
|
| 8 |
|
| 9 |
-
# Gunakan model SBERT
|
| 10 |
-
model = SentenceTransformer('
|
| 11 |
|
| 12 |
index = None
|
| 13 |
sentences = []
|
| 14 |
|
| 15 |
-
# Contoh korpus
|
| 16 |
-
contoh_korpus = """
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
"""
|
| 27 |
|
| 28 |
def build_index(korpus_text):
|
|
@@ -36,51 +46,54 @@ def build_index(korpus_text):
|
|
| 36 |
index = faiss.IndexFlatIP(dim)
|
| 37 |
index.add(embeddings)
|
| 38 |
|
| 39 |
-
return f"✅ Embedding dan Indeksasi untuk {len(sentences)} korpus berhasil dibangun. Anda boleh lanjut mengetes query pencarian di bawah ini
|
| 40 |
|
| 41 |
-
def search_query(query
|
| 42 |
global index, sentences
|
|
|
|
| 43 |
if index is None or not sentences:
|
| 44 |
-
return "⚠️ Indeks belum dibangun."
|
|
|
|
| 45 |
if not query.strip():
|
| 46 |
-
return "⚠️ Masukkan query terlebih dahulu."
|
| 47 |
|
| 48 |
q_emb = model.encode([query.lower()], convert_to_numpy=True, normalize_embeddings=True)
|
| 49 |
-
D, I = index.search(q_emb,
|
| 50 |
|
| 51 |
-
hasil = []
|
| 52 |
-
|
| 53 |
-
if score >= threshold:
|
| 54 |
-
hasil.append([sentences[idx], float(score)])
|
| 55 |
-
if not hasil:
|
| 56 |
-
return [["⚠️ Tidak ada hasil yang cukup relevan", ""]]
|
| 57 |
-
return hasil
|
| 58 |
|
| 59 |
def reset_korpus():
|
| 60 |
-
# fungsi untuk mengisi korpus_box dengan contoh korpus
|
| 61 |
return contoh_korpus
|
| 62 |
|
| 63 |
-
|
| 64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
korpus_box = gr.Textbox(
|
| 66 |
-
label="Silakan masukkan korpus anda
|
| 67 |
lines=8,
|
| 68 |
-
placeholder="Contoh:
|
|
|
|
| 69 |
)
|
| 70 |
|
| 71 |
with gr.Row():
|
| 72 |
-
build_btn = gr.Button("⚙️
|
| 73 |
reset_btn = gr.Button("🔄 Gunakan Contoh Korpus")
|
| 74 |
|
| 75 |
-
status = gr.Textbox(label="Status", interactive=False)
|
| 76 |
build_btn.click(fn=build_index, inputs=korpus_box, outputs=status)
|
| 77 |
reset_btn.click(fn=reset_korpus, inputs=None, outputs=korpus_box)
|
| 78 |
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
topk_slider = gr.Slider(1, 10, value=3, step=1, label="Jumlah hasil (Top-K)")
|
| 82 |
hasil_box = gr.Dataframe(headers=["Kalimat", "Skor"], wrap=True)
|
| 83 |
cari_btn = gr.Button("Cari 🔍")
|
| 84 |
-
|
|
|
|
| 85 |
|
| 86 |
demo.launch(share=True, inline=False)
|
|
|
|
| 6 |
import faiss
|
| 7 |
from sentence_transformers import SentenceTransformer
|
| 8 |
|
| 9 |
+
# Gunakan model SBERT khusus Indonesia
|
| 10 |
+
model = SentenceTransformer('denaya/indoSBERT-large')
|
| 11 |
|
| 12 |
index = None
|
| 13 |
sentences = []
|
| 14 |
|
| 15 |
+
# Contoh korpus
|
| 16 |
+
contoh_korpus = """Teknologi blockchain memungkinkan pencatatan transaksi terdistribusi yang sulit dipalsukan.
|
| 17 |
+
Jaringan Internet of Things menghubungkan perangkat fisik ke sistem daring.
|
| 18 |
+
Kecerdasan buatan mampu mengenali pola dari data besar untuk pengambilan keputusan.
|
| 19 |
+
Komputasi awan menyediakan sumber daya komputasi fleksibel melalui internet.
|
| 20 |
+
Enkripsi kriptografi menjaga kerahasiaan komunikasi elektronik.
|
| 21 |
+
Fotosintesis mengubah energi cahaya menjadi senyawa organik pada tumbuhan.
|
| 22 |
+
Ekosistem hutan hujan menopang keanekaragaman hayati yang tinggi.
|
| 23 |
+
Migrasi burung terjadi mengikuti perubahan musim dan ketersediaan makanan.
|
| 24 |
+
DNA menyimpan informasi genetik yang diwariskan antar generasi.
|
| 25 |
+
Terumbu karang menyediakan habitat penting bagi organisme laut.
|
| 26 |
+
Inflasi mencerminkan kenaikan harga barang dan jasa secara berkelanjutan.
|
| 27 |
+
Pasar saham mempertemukan investor untuk memperjualbelikan kepemilikan perusahaan.
|
| 28 |
+
Permintaan dan penawaran menentukan harga dalam mekanisme pasar.
|
| 29 |
+
Kebijakan moneter bank sentral memengaruhi tingkat suku bunga.
|
| 30 |
+
Kewirausahaan mendorong inovasi dan penciptaan lapangan kerja baru.
|
| 31 |
+
Olahraga aerobik teratur meningkatkan kapasitas paru dan jantung.
|
| 32 |
+
Tidur nyenyak mendukung konsolidasi memori dan fungsi kognitif.
|
| 33 |
+
Pola makan seimbang membantu menjaga metabolisme tubuh.
|
| 34 |
+
Meditasi rutin dapat menurunkan tingkat stres psikologis.
|
| 35 |
+
Vaksinasi melindungi populasi dari penyebaran penyakit menular.
|
| 36 |
"""
|
| 37 |
|
| 38 |
def build_index(korpus_text):
|
|
|
|
| 46 |
index = faiss.IndexFlatIP(dim)
|
| 47 |
index.add(embeddings)
|
| 48 |
|
| 49 |
+
return f"✅ Embedding dan Indeksasi untuk {len(sentences)} korpus berhasil dibangun. Anda boleh lanjut mengetes query pencarian di bawah ini."
|
| 50 |
|
| 51 |
+
def search_query(query):
|
| 52 |
global index, sentences
|
| 53 |
+
|
| 54 |
if index is None or not sentences:
|
| 55 |
+
return [[ "⚠️ Indeks belum dibangun.", "" ]], "⚠️ Pastikan daftar korpus telah terisi, kemudian menekan tombol 'Proses Korpus'."
|
| 56 |
+
|
| 57 |
if not query.strip():
|
| 58 |
+
return [[ "⚠️ Masukkan query terlebih dahulu.", "" ]], "⚠️ Query masih kosong."
|
| 59 |
|
| 60 |
q_emb = model.encode([query.lower()], convert_to_numpy=True, normalize_embeddings=True)
|
| 61 |
+
D, I = index.search(q_emb, len(sentences))
|
| 62 |
|
| 63 |
+
hasil = [[sentences[idx], float(score)] for idx, score in zip(I[0], D[0])]
|
| 64 |
+
return hasil, f"✅ Pencarian selesai. Berikut daftar {len(hasil)} hasil dengan skor kemiripan dari tertinggi ke terendah. Sebagai catatan bahwa bisa saja query yang anda masukkan tidak relevan dengan korpus yang mempunyai skor tertinggi, ini disebabkan karena model dan korpus belum melewati fase fine tunning."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
|
| 66 |
def reset_korpus():
|
|
|
|
| 67 |
return contoh_korpus
|
| 68 |
|
| 69 |
+
# CSS untuk alignment teks di dalam textbox
|
| 70 |
+
custom_css = """
|
| 71 |
+
.centered textarea {text-align: center;}
|
| 72 |
+
.lefted textarea {text-align: left;}
|
| 73 |
+
"""
|
| 74 |
+
|
| 75 |
+
with gr.Blocks(css=custom_css) as demo:
|
| 76 |
+
gr.Markdown("## 🔎 DEMO SBERT | model IndoSBERT")
|
| 77 |
korpus_box = gr.Textbox(
|
| 78 |
+
label="Silakan masukkan korpus anda",
|
| 79 |
lines=8,
|
| 80 |
+
placeholder="Contoh: Vaksinasi melindungi populasi dari penyebaran penyakit menular.\nTidur nyenyak mendukung konsolidasi memori dan fungsi kognitif.",
|
| 81 |
+
elem_classes="lefted"
|
| 82 |
)
|
| 83 |
|
| 84 |
with gr.Row():
|
| 85 |
+
build_btn = gr.Button("⚙️ Proses Korpus")
|
| 86 |
reset_btn = gr.Button("🔄 Gunakan Contoh Korpus")
|
| 87 |
|
| 88 |
+
status = gr.Textbox(lines=2, label="Status", interactive=False)
|
| 89 |
build_btn.click(fn=build_index, inputs=korpus_box, outputs=status)
|
| 90 |
reset_btn.click(fn=reset_korpus, inputs=None, outputs=korpus_box)
|
| 91 |
|
| 92 |
+
query_box = gr.Textbox(label="Query", placeholder="Masukkan pertanyaan atau kata kunci, contoh pertanyaan: Apa istilah untuk kondisi ekonomi ketika ongkos hidup meningkat terus menerus?")
|
| 93 |
+
|
|
|
|
| 94 |
hasil_box = gr.Dataframe(headers=["Kalimat", "Skor"], wrap=True)
|
| 95 |
cari_btn = gr.Button("Cari 🔍")
|
| 96 |
+
# sekarang search_query mengembalikan 2 output: hasil + status
|
| 97 |
+
cari_btn.click(fn=search_query, inputs=query_box, outputs=[hasil_box, status])
|
| 98 |
|
| 99 |
demo.launch(share=True, inline=False)
|