Код 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
Counterдля частот,setдля документной частоты.- Не забудьте ветку пустых документов:
avgdl == 0.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.