File size: 1,919 Bytes
f498d44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
44
45
46
47
48
49
50
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer 
from sentence_transformers import SentenceTransformer 
from typing import List
import joblib
from core.config import settings

class HybridVectorizer:
    def __init__(self, model_name='keepitreal/vietnamese-sbert'):
        self.tfidf_vectorizer = TfidfVectorizer()
        self.sentence_transformer = SentenceTransformer(model_name) 

    def fit(self, corpus: List[str]):
        """
        Fit (huấn luyện) TfidfVectorizer trên toàn bộ corpus.
        """
        print("Fitting TF-IDF Vectorizer...")
        self.tfidf_vectorizer.fit(corpus)
        print("TF-IDF fitting complete.")
        
        # Lưu lại vectorizer đã fit
        joblib.dump(self.tfidf_vectorizer, settings.VECTORIZER_PATH)
        print(f"TF-IDF Vectorizer saved to {settings.VECTORIZER_PATH}")

    def load_fitted_tfidf(self, path: str):
        """
        Tải TF-IDF vectorizer đã được fit từ file.
        """
        try:
            self.tfidf_vectorizer = joblib.load(path)
            print(f"Loaded fitted TF-IDF from {path}")
        except FileNotFoundError:
            print(f"Error: Fitted TF-IDF file not found at {path}. Run ingest_data.py first.")
            # Xử lý lỗi
            
    def transform_single(self, text: str) -> np.ndarray:
        """
        Tạo hybrid vector cho một chunk text hoặc một query.
        """
        # 1. TF-IDF vector (Sparse matrix -> dense array)
        tfidf_vec = self.tfidf_vectorizer.transform([text]).toarray()
        
        # 2. Semantic (ST) vector
        semantic_vec = self.sentence_transformer.encode([text])
        
        # 3. Kết hợp (concatenate)
        hybrid_vec = np.concatenate([tfidf_vec, semantic_vec], axis=1)
        
        # Chuyển về list float cơ bản để dùng với MongoDB/JSON
        return hybrid_vec[0].tolist()