/** * BM25 text-search ranking util a LVS hybrid search-hez (FR-004). * * Pure TypeScript, dependency-free. In-memory corpus alapjan szamol score-okat, * NEM perzisztal indexet (a hybrid hivasonkent ujraepiti a corpus-t a candidate * dokumentumokon — kis (~100..10000 dokumentum) LVS-corpus eseten ez gyors es * egyszeru). * * Canonical params: k1=1.2, b=0.75 (industry standard a "lucene-szeru" * implementaciokban). NEM expose-oltak — ha kell, FR-002 kovetkezo iteracioban * tehetjuk parameterizalhatova. * * Tokenizer: `text.toLowerCase().match(/\w+/g) || []`. Case-insensitive, * alphanumeric+underscore boundary-k. `UserController` egy token marad (jo az * identifier match-re), `auth-flow` ket tokenre esik (auth + flow). * * IDF formula (BM25+): `log((N - df + 0.5) / (df + 0.5) + 1)`. A +1 a logon * belul garantalja, hogy a kozos szavak is pozitiv (kicsi) IDF-et kapjanak, * NEM negativ-t — fontos a hybrid score-merge-nel hogy ne huzzon le dokumentumot * ahol kozos szo szerepel. */ /** * Egy dokumentum BM25-score-ja egy query ellen, egy elore-felepitett corpus * konteztusaban. */ export interface DyNTS_LVS_BM25_DocScore { /** Dokumentum azonosito (mint az LVS_SearchResult `id`-jaben). */ id: string; /** Nyers BM25 score (0..∞). NEM normalizalt. */ score: number; } /** * Felepitett BM25 corpus — egy adott dokumentumhalmaz indexe. A `score()` az * indexen kerdez le egy query-t es minden dokumentumra ad egy score-t. * * Egy corpus egyszer-hasznalatos a hybrid search hivasban — NEM kell cache-elni, * a felepites O(N * |doc|) ami pici N-re elhanyagolhato. */ export declare class DyNTS_LVS_BM25_Corpus { /** Tokenizalt dokumentumok: id -> tokens. */ private readonly docTokens; /** Doc-length: id -> token count. */ private readonly docLengths; /** Term -> doc-frequency (hany docban szerepel az adott term, legalabb 1x). */ private readonly termDocFreq; /** Term -> id -> term-frequency a docban. */ private readonly termFreqByDoc; /** Atlagos dokumentum-hossz (token count). */ private avgDocLength; /** Total doc count. */ private docCount; /** * Letrehoz egy uj corpus-t a megadott id->text parok-bol. * NEM dob hibat ures input-ra — ures corpus ervenyes (minden score = 0). */ constructor(docs: { id: string; text: string; }[]); /** * Public tokenizer — exportalt, hogy spec-ek + hivok ugyanazt a normalizalast * tudjak hasznalni mint a corpus. */ static tokenize(text: string): string[]; /** * Visszaadja a corpus dokumentum-szamat (NEM-ures docok). */ size(): number; /** * BM25 score minden dokumentumra a query-re. * * Ures query → minden score 0 (degenerate case; a hivo kezelje ha kell). * Ures corpus → ures array. */ score(query: string): DyNTS_LVS_BM25_DocScore[]; } /** * Min-max normalizalas [0,1] tartomanyra. A hybrid score-merge-hez kell a BM25 * score-okat a candidate-szetten 0..1 sav-ba hozni (a cosine mar 0..1). * * Edge case-ek: * - Ures array → []. * - Minden score azonos (max-min === 0) → minden 0.0 (NEM 0.5 vagy 1.0; ha * nincs diszkriminacio, ne tegyunk hozza signal-t). * - Negativ score-ok (BM25+IDF garantal pozitivat, de defensive): a min-max * ugyanugy mukodik. */ export declare function dyNTS_LVS_BM25_minMaxNormalize(scores: DyNTS_LVS_BM25_DocScore[]): DyNTS_LVS_BM25_DocScore[]; //# sourceMappingURL=lvs-bm25.util.d.ts.map