Spaces:
Running
Running
File size: 1,881 Bytes
21bdc64 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | # ์๋ฒ ๋ฉ ์ฝ์ฌ์ธ ์ ์ฌ๋๋ก ์๋ ์ค์ฌ์ ์ถ์ ์ฐ๊ด ๊ฒฝ๋ก(ํธ๋ฆฌํ ๋คํธ์ํฌ)๋ฅผ ๋ง๋๋ ๋ชจ๋
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}
|