ImilKamil commited on
Commit
2e88fc1
·
verified ·
1 Parent(s): 5de8290

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -36
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 yang cenderung lebih kuat dan ringan
10
- model = SentenceTransformer('sentence-transformers/all-MiniLM-L12-v2')
11
 
12
  index = None
13
  sentences = []
14
 
15
- # Contoh korpus (10 kalimat)
16
- contoh_korpus = """Kucing adalah hewan peliharaan yang sangat populer di seluruh dunia.
17
- Bahasa pemrograman Python banyak digunakan untuk analisis data dan kecerdasan buatan.
18
- Teknologi energi terbarukan semakin penting untuk mengatasi perubahan iklim.
19
- Sepak bola adalah olahraga paling populer di dunia.
20
- Kopi hitam sering diminum untuk menambah energi di pagi hari.
21
- Musik dapat memengaruhi suasana hati seseorang secara signifikan.
22
- Gunung adalah destinasi favorit bagi para pendaki alam.
23
- Internet telah mengubah cara manusia berkomunikasi dan bekerja.
24
- Matematika adalah dasar dari banyak disiplin ilmu pengetahuan.
25
- Transportasi umum membantu mengurangi kemacetan di kota besar.
 
 
 
 
 
 
 
 
 
 
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, yang nantinya akan mengembalikan daftar hasil korpus yang paling sesuai berdasarkan skor kemiripan."
40
 
41
- def search_query(query, top_k=3, threshold=0.4):
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, top_k)
50
 
51
- hasil = []
52
- for idx, score in zip(I[0], D[0]):
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
- with gr.Blocks() as demo:
64
- gr.Markdown("## 🔎 Semantic Search dengan SBERT (Optimized) + FAISS")
 
 
 
 
 
 
65
  korpus_box = gr.Textbox(
66
- label="Silakan masukkan korpus anda, satu korpus dihitung ketika Anda menekan enter (baris baru)",
67
  lines=8,
68
- placeholder="Contoh: Sepak bola adalah olahraga paling populer di dunia."
 
69
  )
70
 
71
  with gr.Row():
72
- build_btn = gr.Button("⚙️ Bangun Embedding dan Indeksnya")
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
- with gr.Row():
80
- query_box = gr.Textbox(label="Query",placeholder="Terkait dengan olahraga")
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
- cari_btn.click(fn=search_query, inputs=[query_box, topk_slider], outputs=hasil_box)
 
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)