Умный поиск по заметкам
import os
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# 📁 Путь к папке с заметками
NOTES_FOLDER = "notebooks"
# 📌 Модель для смысловых векторов
model = SentenceTransformer("all-MiniLM-L6-v2")
# 📥 Загрузка и индексация заметок
def load_notes(folder):
notes = []
filenames = []
for file in os.listdir(folder):
if file.endswith(".txt") or file.endswith(".md"):
path = os.path.join(folder, file)
with open(path, "r", encoding="utf-8") as f:
content = f.read()
notes.append(content)
filenames.append(file)
return notes, filenames
# 🔍 Поиск похожих заметок
def semantic_search(query, notes, vectors, filenames, top_k=3):
query_vec = model.encode([query])
D, I = index.search(query_vec, top_k)
results = []
for i, idx in enumerate(I[0]):
snippet = notes[idx][:300].replace("\n", " ").strip()
results.append((filenames[idx], D[0][i], snippet))
return results
# ▶️ Основной блок
notes, filenames = load_notes(NOTES_FOLDER)
vectors = model.encode(notes)
# Построение индекса FAISS
dim = vectors.shape[1]
index = faiss.IndexFlatL2(dim)
index.add(np.array(vectors))
# 🔁 Цикл запросов
while True:
q = input("\n🔎 Запрос (или 'exit'): ").strip()
if q.lower() in ['exit', 'quit']:
break
results = semantic_search(q, notes, vectors, filenames)
print("\n📚 Результаты:")
for fname, score, snippet in results:
print(f"\n📝 {fname} (схожесть: {score:.2f})")
print(f" → {snippet[:150]}...")