svg / app.py
openfree's picture
Create app.py
f799edd verified
raw
history blame
1.97 kB
import gradio as gr
from datasets import load_dataset
from rapidfuzz import process, fuzz
# 1) 데이터셋 스트리밍 로드(메타만 메모리에 보관)
ds = load_dataset("nyuuzyou/clker-svg", split="train", streaming=True)
records = []
for ex in ds:
records.append(
{
"id": ex["id"],
"title": ex["title"] or "",
"tags": " ".join(ex["tags"] or []),
"svg": ex["svg_content"],
"url": ex["download_url"],
}
)
# 2) 검색 함수
def search_svg(query, top_k):
if not query:
return "⚠️ 검색어를 입력하세요.", None
# title+tags 스트링 하나로 결합
choices = {i: r["title"] + " " + r["tags"] for i, r in enumerate(records)}
matched = process.extract(
query,
choices,
scorer=fuzz.WRatio,
limit=top_k,
)
# Rapidfuzz 결과 → SVG HTML 변환
html_snippets = []
for idx, score, _ in matched:
r = records[idx]
svg_html = (
f"<div style='border:1px solid #ddd;margin:8px;padding:8px'>"
f"<strong>{r['title']}</strong> "
f"(score {score})<br>"
f"<em>{r['tags']}</em><br>"
f"<a href='{r['url']}' target='_blank'>원본&nbsp;다운로드</a><br>"
f"{r['svg']}" # raw SVG → 브라우저가 바로 렌더
f"</div>"
)
html_snippets.append(svg_html)
return "", "\n".join(html_snippets)
with gr.Blocks(title="Clker SVG 검색") as demo:
gr.Markdown("## 🔍 Clker.com SVG Public-Domain Clipart 검색")
with gr.Row():
query = gr.Textbox(label="검색어", placeholder="예: cat, tree, …")
top_k = gr.Slider(1, 50, value=10, step=1, label="결과 개수")
warn = gr.Markdown()
out = gr.HTML()
query.submit(
fn=search_svg,
inputs=[query, top_k],
outputs=[warn, out],
)
if __name__ == "__main__":
demo.launch()