Умный поиск по заметкам

Умный поиск по заметкам


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]}...")

Report Page