File size: 1,445 Bytes
cd3d2c2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import json
import numpy as np

def load_artifacts(precomputed_dir: str) -> tuple[np.ndarray, np.ndarray, list]:
    """Loads the precomputed artifacts: jd_vec.npy, cand_vecs.npy, and cand_ids.json."""
    jd_vec_path = os.path.join(precomputed_dir, "jd_vec.npy")
    cand_vecs_path = os.path.join(precomputed_dir, "cand_vecs.npy")
    cand_ids_path = os.path.join(precomputed_dir, "cand_ids.json")
    
    jd_vec = np.load(jd_vec_path)
    cand_vecs = np.load(cand_vecs_path)
    
    with open(cand_ids_path, "r", encoding="utf-8") as f:
        cand_ids = json.load(f)
        
    return jd_vec, cand_vecs, cand_ids

def compute_C_all(jd_vec: np.ndarray, cand_vecs: np.ndarray) -> np.ndarray:
    """Computes semantic similarity for all candidates in a single vectorized matrix multiplication."""
    # Ensure 2D shapes for multiplication
    if len(jd_vec.shape) == 1:
        jd_vec = jd_vec.reshape(1, -1)
    if len(cand_vecs.shape) == 1:
        cand_vecs = cand_vecs.reshape(1, -1)
        
    scores = (cand_vecs @ jd_vec.T).squeeze()
    scores = np.clip(scores, 0.0, 1.0)
    return np.atleast_1d(scores)

def get_C_map(jd_vec: np.ndarray, cand_vecs: np.ndarray, cand_ids: list) -> dict[str, float]:
    """Computes similarity and returns a dictionary mapping candidate IDs to embedding scores."""
    scores = compute_C_all(jd_vec, cand_vecs)
    return {str(cid): float(score) for cid, score in zip(cand_ids, scores)}