Код Middle RAG спрашивают часто обновлено

BM25 для маленького корпуса

Условие

Реализуйте bm25(query, docs, k1=1.5, b=0.75). Токены: слова в нижнем регистре, разбиение по пробельным символам (str.lower().split()).

  • N число документов, n(t) число документов с термином t, avgdl средняя длина документа в токенах.
  • idf(t) = ln((N - n(t) + 0.5) / (n(t) + 0.5) + 1).
  • Оценка документа: сумма по уникальным терминам запроса idf(t) · tf · (k1 + 1) / (tf + k1 · (1 - b + b · dl / avgdl)), где tf частота термина в документе, dl длина документа.

Верните список оценок по документам, округлённых до 4 знаков. Если документов нет, []; если все документы пустые, оценки нули.

Примеры

bm25("кот", ["кот спит", "собака бежит", "кот и кот"]) // [0.5023, 0, 0.615]
bm25("ошибка e-4012", ["ошибка оплаты e-4012", "ошибка входа", "оплата картой"]) // [1.2855, 0.5023, 0]
bm25("кот", []) // []

Как подойти

Подсказки: 2
  1. Counter для частот, set для документной частоты.
  2. Не забудьте ветку пустых документов: avgdl == 0.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.