File size: 1,464 Bytes
6f4603d | 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 | import torch
from sentence_transformers import SentenceTransformer, util
class CoreModel:
def __init__(self, model_name="all-MiniLM-L6-v2"):
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
self.model = SentenceTransformer(model_name).to(self.device)
def compute_similarity(self, input_text: str, candidates: list[str]) -> list[tuple[str, float]]:
"""
Расчитывает сходство входного текста с каждым из кандидатов и возвращает отсортированный список.
"""
input_emb = self.model.encode(input_text, convert_to_tensor=True).to(self.device)
candidates_emb = self.model.encode(candidates, convert_to_tensor=True).to(self.device)
similarities = util.cos_sim(input_emb, candidates_emb)[0]
scored_candidates = [(candidates[i], float(similarities[i])) for i in range(len(candidates))]
scored_candidates.sort(key=lambda x: x[1], reverse=True)
return scored_candidates
def extract_top_k(self, input_text: str, candidates: list[str], top_k: int = 3) -> list[str]:
"""
Возвращает топ-K наиболее релевантных кандидатов на основе сходства.
"""
similarities = self.compute_similarity(input_text, candidates)
return [candidate for candidate, _ in similarities[:top_k]]
|