UNPKG

mongodb-rag-core

Version:

Common elements used by MongoDB Chatbot Framework components.

65 lines (64 loc) 2.44 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ndcg = exports.binaryNdcgAtK = void 0; const assertKIsValid_1 = require("./assertKIsValid"); /** Calculate binary Normalized Discounted Cumulative Gain (NDCG) at rank K. NDCG is a measure of ranking quality that evaluates how well the retrieved results are ordered by relevance, considering the position of each result. For binary relevance (relevant or not relevant), relevance scores are 1 or 0. @param relevantItems - List of expected relevant items (all with relevance score 1). @param retrievedItems - List of retrieved items to evaluate. @param matchFunc - Function to compare items for equality. @param k - Cutoff rank (top-k results to consider). @returns Binary NDCG at rank K. */ function binaryNdcgAtK(relevantItems, retrievedItems, matchFunc, k) { (0, assertKIsValid_1.assertKIsValid)(k); const limit = Math.min(k, retrievedItems.length); const deduplicatedRetrievedItems = removeDuplicates(retrievedItems, limit); const relevanceScores = calculateRelevanceScores(deduplicatedRetrievedItems, relevantItems, matchFunc); // Use the ndcg function to calculate NDCG return ndcg(relevanceScores, relevantItems.length, k); } exports.binaryNdcgAtK = binaryNdcgAtK; function removeDuplicates(items, limit) { const itemsInLimit = items.slice(0, limit); const seen = new Set(); return itemsInLimit.map((item) => { if (seen.has(item)) { return null; } else { seen.add(item); return item; } }); } function calculateRelevanceScores(retrievedItems, relevantItems, matchFunc) { return retrievedItems.map((item) => { // handle duplicate items if (item === null) { return 0; } return relevantItems.some((relevantItem) => matchFunc(relevantItem, item)) ? 1 : 0; }); } /** Normalized Discounted Cumulative Gain (NDCG) */ function ndcg(realScores, idealNum, k) { const actualDcg = dcg(realScores); const idealDcg = dcg(ideal(idealNum, k)); return idealDcg === 0 ? 0 : actualDcg / idealDcg; } exports.ndcg = ndcg; function dcg(scores) { return scores.reduce((sum, gain, i) => sum + gain / Math.log2(i + 2), 0); } function ideal(n, k) { return Array.from({ length: k }, (_, i) => (i < n ? 1 : 0)); } //# sourceMappingURL=binaryNdcgAtK.js.map