Spaces:
Sleeping
Sleeping
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() |