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]]