Spaces:
Running
Running
| # ์๋ฒ ๋ฉ ์ฝ์ฌ์ธ ์ ์ฌ๋๋ก ์๋ ์ค์ฌ์ ์ถ์ ์ฐ๊ด ๊ฒฝ๋ก(ํธ๋ฆฌํ ๋คํธ์ํฌ)๋ฅผ ๋ง๋๋ ๋ชจ๋ | |
| import numpy as np | |
| from clusterer import _model | |
| def build_search_path(seed: str, df, embeddings, top_n: int = 12) -> dict: | |
| # df์ embeddings๋ ๊ฐ์ ์์๋ก ์ ๋ ฌ๋ผ ์์ด์ผ ํ๋ค (filter_by_relevance ์ถ๋ ฅ) | |
| # ์ค์ ์์ฐจ ๊ฒ์ ๋ก๊ทธ๊ฐ ์๋๋ผ, ์๋ฏธ ์ ์ฌ๋ ๊ธฐ๋ฐ ์ถ์ ์ฐ๊ฒฐ๋ง์ด๋ค. | |
| if len(df) < 2: | |
| return {"nodes": [], "edges": []} | |
| df = df.reset_index(drop=True).copy() | |
| df["total_volume"] = df["search_volume_pc"].fillna(0) + df["search_volume_mobile"].fillna(0) | |
| emb = np.asarray(embeddings) | |
| # ๊ฒ์๋ ์์ ํค์๋๋ฅผ ๋ ธ๋ ํ๋ณด๋ก (์๋ ์์ ์ ์ ์ธ) | |
| order = df.sort_values("total_volume", ascending=False) | |
| picked = [i for i in order.index if df.loc[i, "keyword"] != seed][:top_n] | |
| seed_emb = _model().encode([seed], normalize_embeddings=True)[0] | |
| seed_vol = int(df.loc[df["keyword"] == seed, "total_volume"].max()) if (df["keyword"] == seed).any() else None | |
| nodes = [{"id": 0, "keyword": seed, "volume": seed_vol, "depth": 0}] | |
| node_vecs = [seed_emb] | |
| edges = [] | |
| # ๊ฐ ํค์๋๋ฅผ "์ด๋ฏธ ๋ฐฐ์น๋ ๋ ธ๋ ์ค ๊ฐ์ฅ ์ ์ฌํ ๊ฒ"์ ๋ถ์ฌ ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค | |
| for rank, i in enumerate(picked, start=1): | |
| vec = emb[i] | |
| sims = [float(np.dot(vec, nv)) for nv in node_vecs] # ์ ๊ทํ ์๋ฒ ๋ฉ โ ๋ด์ =์ฝ์ฌ์ธ | |
| parent = int(np.argmax(sims)) | |
| nodes.append({ | |
| "id": rank, | |
| "keyword": df.loc[i, "keyword"], | |
| "volume": int(df.loc[i, "total_volume"]), | |
| "depth": nodes[parent]["depth"] + 1, | |
| }) | |
| node_vecs.append(vec) | |
| edges.append({"source": parent, "target": rank, "relation": round(sims[parent], 3)}) | |
| return {"nodes": nodes, "edges": edges} | |