Update app.py
Browse files
app.py
CHANGED
@@ -2,8 +2,14 @@ import gradio as gr
|
|
2 |
from datasets import load_dataset
|
3 |
from rapidfuzz import process, fuzz
|
4 |
|
5 |
-
#
|
6 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
|
8 |
records = []
|
9 |
for ex in ds:
|
@@ -17,50 +23,55 @@ for ex in ds:
|
|
17 |
}
|
18 |
)
|
19 |
|
|
|
20 |
# 2) 검색 함수
|
21 |
-
|
22 |
-
|
|
|
23 |
return "⚠️ 검색어를 입력하세요.", None
|
24 |
|
25 |
-
# title+tags
|
26 |
-
choices = {i: r[
|
|
|
|
|
27 |
matched = process.extract(
|
28 |
query,
|
29 |
choices,
|
30 |
scorer=fuzz.WRatio,
|
31 |
-
limit=top_k,
|
32 |
)
|
33 |
|
34 |
-
# Rapidfuzz 결과 → SVG HTML 변환
|
35 |
html_snippets = []
|
36 |
-
for
|
37 |
r = records[idx]
|
38 |
svg_html = (
|
39 |
-
|
40 |
f"<strong>{r['title']}</strong> "
|
41 |
f"(score {score})<br>"
|
42 |
f"<em>{r['tags']}</em><br>"
|
43 |
f"<a href='{r['url']}' target='_blank'>원본 다운로드</a><br>"
|
44 |
-
f"{r['svg']}" #
|
45 |
-
|
46 |
)
|
47 |
html_snippets.append(svg_html)
|
48 |
|
49 |
return "", "\n".join(html_snippets)
|
50 |
|
51 |
-
|
|
|
|
|
52 |
with gr.Blocks(title="Clker SVG 검색") as demo:
|
53 |
gr.Markdown("## 🔍 Clker.com SVG Public-Domain Clipart 검색")
|
54 |
with gr.Row():
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
|
60 |
-
|
61 |
fn=search_svg,
|
62 |
-
inputs=[
|
63 |
-
outputs=[
|
64 |
)
|
65 |
|
66 |
if __name__ == "__main__":
|
|
|
2 |
from datasets import load_dataset
|
3 |
from rapidfuzz import process, fuzz
|
4 |
|
5 |
+
# ──────────────────────────────────────────────────────────
|
6 |
+
# 1) 데이터셋 로드 (스트리밍) ─ 메모리에 메타만 저장
|
7 |
+
# ──────────────────────────────────────────────────────────
|
8 |
+
ds = load_dataset(
|
9 |
+
"nyuuzyou/clker-svg",
|
10 |
+
split="train",
|
11 |
+
streaming=True, # .jsonl.zst → 자동 스트리밍 해제
|
12 |
+
)
|
13 |
|
14 |
records = []
|
15 |
for ex in ds:
|
|
|
23 |
}
|
24 |
)
|
25 |
|
26 |
+
# ──────────────────────────────────────────────────────────
|
27 |
# 2) 검색 함수
|
28 |
+
# ──────────────────────────────────────────────────────────
|
29 |
+
def search_svg(query: str, top_k: int):
|
30 |
+
if not query.strip():
|
31 |
return "⚠️ 검색어를 입력하세요.", None
|
32 |
|
33 |
+
# choices: index(int) ➜ title+tags 한 줄 문자열
|
34 |
+
choices = {i: f"{r['title']} {r['tags']}" for i, r in enumerate(records)}
|
35 |
+
|
36 |
+
# Rapidfuzz: (choice_text, score, key) 반환
|
37 |
matched = process.extract(
|
38 |
query,
|
39 |
choices,
|
40 |
scorer=fuzz.WRatio,
|
41 |
+
limit=int(top_k),
|
42 |
)
|
43 |
|
|
|
44 |
html_snippets = []
|
45 |
+
for _choice_text, score, idx in matched: # idx 가 실제 list 인덱스
|
46 |
r = records[idx]
|
47 |
svg_html = (
|
48 |
+
"<div style='border:1px solid #ddd;margin:8px;padding:8px'>"
|
49 |
f"<strong>{r['title']}</strong> "
|
50 |
f"(score {score})<br>"
|
51 |
f"<em>{r['tags']}</em><br>"
|
52 |
f"<a href='{r['url']}' target='_blank'>원본 다운로드</a><br>"
|
53 |
+
f"{r['svg']}" # 브라우저가 즉시 SVG 렌더
|
54 |
+
"</div>"
|
55 |
)
|
56 |
html_snippets.append(svg_html)
|
57 |
|
58 |
return "", "\n".join(html_snippets)
|
59 |
|
60 |
+
# ──────────────────────────────────────────────────────────
|
61 |
+
# 3) Gradio UI
|
62 |
+
# ──────────────────────────────────────────────────────────
|
63 |
with gr.Blocks(title="Clker SVG 검색") as demo:
|
64 |
gr.Markdown("## 🔍 Clker.com SVG Public-Domain Clipart 검색")
|
65 |
with gr.Row():
|
66 |
+
query_box = gr.Textbox(label="검색어", placeholder="예: cat, tree, ...")
|
67 |
+
top_slider = gr.Slider(1, 50, value=10, step=1, label="결과 개수")
|
68 |
+
warning_md = gr.Markdown()
|
69 |
+
output_html = gr.HTML()
|
70 |
|
71 |
+
query_box.submit(
|
72 |
fn=search_svg,
|
73 |
+
inputs=[query_box, top_slider],
|
74 |
+
outputs=[warning_md, output_html],
|
75 |
)
|
76 |
|
77 |
if __name__ == "__main__":
|