// Track CJK characters with their original positions const chars = Array.from(lower); const cjkData: { char: string; index: number }[] = []; for (let i = 0; i < chars.length; i++) { if (CJK_RE.test(chars[i])) {
cjkData.push({ char: chars[i], index: i });
}
}
// Build bigrams only from originally adjacent CJK characters const bigrams: string[] = []; for (let i = 0; i < cjkData.length - 1; i++) { if (cjkData[i + 1].index === cjkData[i].index + 1) {
bigrams.push(cjkData[i].char + cjkData[i + 1].char);
}
}
// Early exits if (!enabled || items.length <= 1) { return [...items];
}
// Clamp lambda to valid range const clampedLambda = Math.max(0, Math.min(1, lambda));
// If lambda is 1, just return sorted by relevance (no diversity penalty) if (clampedLambda === 1) { return [...items].toSorted((a, b) => b.score - a.score);
}
// Pre-tokenize all items for efficiency const tokenCache = new Map<string, Set<string>>(); for (const item of items) {
tokenCache.set(item.id, tokenize(item.content));
}
// Normalize scores to [0, 1] for fair comparison with similarity const maxScore = Math.max(...items.map((i) => i.score)); const minScore = Math.min(...items.map((i) => i.score)); const scoreRange = maxScore - minScore;
const normalizeScore = (score: number): number => { if (scoreRange === 0) { return1; // All scores equal
} return (score - minScore) / scoreRange;
};
const selected: T[] = []; const remaining = new Set(items);
// Select items iteratively while (remaining.size > 0) {
let bestItem: T | null = null;
let bestMMRScore = -Infinity;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.