| 21 | self.vectors = None # Reset vectors to force recalculation |
| 22 | |
| 23 | def get_relevant(self, query: str, n: int = 10) -> List[str]: |
| 24 | if not self.items: |
| 25 | return [] |
| 26 | |
| 27 | if self.vectors is None: |
| 28 | self.vectors = self.vectorizer.fit_transform(self.items) |
| 29 | |
| 30 | query_vector = self.vectorizer.transform([query]) |
| 31 | similarities = cosine_similarity(query_vector, self.vectors).flatten() |
| 32 | top_indices = similarities.argsort()[-n:][::-1] |
| 33 | |
| 34 | return [self.items[i] for i in top_indices] |
| 35 | |
| 36 | def extract_query(text: str) -> Tuple[str, str]: |
| 37 | query_index = text.rfind("Query:") |