TF(t,d) = liczba wystąpień terminu t w dokumencie d / całkowita liczba słów w d. IDF(t) = log(N / df(t)), gdzie N = liczba dokumentów, df(t) = liczba dokumentów zawierających t. TF-IDF(t,d) = TF(t,d) × IDF(t). Wynikowe wektory dokumentów są rzadkie i mogą być używane w wyszukiwaniu i klasyfikacji.
Bag-of-Words traktuje wszystkie słowa jednakowo — słowa takie jak "i", "w", "jest" mają wysoką częstość, ale niską wartość informacyjną. TF-IDF nadaje niższe wagi popularnym słowom i wyższe rzadkim, specyficznym dla danego dokumentu.
Częstość wystąpień terminu t w dokumencie d. Stosowane warianty: surowy count, count znormalizowany długością dokumentu, log(1+tf), boolean, sublinear scaling.
Oficjalna
Globalny czynnik karzący terminy częste w korpusie. Klasycznie IDF(t) = log(N / df(t)); warianty z wygładzaniem: log((N+1)/(df(t)+1))+1 (smooth IDF, scikit-learn) lub log((N - df(t) + 0.5)/(df(t) + 0.5)) (probabilistic, BM25).
Oficjalna
Po obliczeniu TF·IDF wektory dokumentów są zwykle normalizowane do długości jednostkowej (L2), co umożliwia porównywanie podobieństwa kosinusowego niezależnie od długości dokumentu.
Oficjalna
TF-IDF nie może być obliczane inkrementalnie — każdy nowy dokument zmienia IDF wszystkich terminów. Dynamiczne korpusy wymagają periodycznego re-buildowania indeksu lub przybliżonych metod.
TF-IDF traktuje "samochód" i "auto" jako niezależne terminy. Dla zadań wymagających semantycznego dopasowania (question answering, RAG) embeddingi gęste są lepszym wyborem.
Surowe TF nadaje słowu występującemu 100 razy 100× większą wagę niż występującemu raz, co rzadko odzwierciedla relewancję. BM25 rozwiązuje to przez saturację (k1).
ngram_range=(1,3) bez min_df / max_df potrafi wygenerować miliony cech, z których większość to literówki lub hapax legomena — model przeucza się i indeks puchnie.
Zapytanie musi przejść identyczny tokenizer / stemmer / lowercasing co dokumenty w indeksie. Inny preprocessing = miss w odwróconym indeksie.
IBM-owski badacz Hans Peter Luhn proponuje automatyczne indeksowanie dokumentów na podstawie częstości słów — fundament komponentu TF.
Praca "A Statistical Interpretation of Term Specificity and Its Application in Retrieval" wprowadza ideę, że specyficzność terminu (IDF) powinna ważyć jego statystykę dokumentową.
Praca "Term-weighting approaches in automatic text retrieval" systematyzuje rodzinę formuł TF·IDF (notacja SMART) używaną do dziś.
Robertson i in. publikują Okapi BM25 — saturujący wariant TF z normalizacją długości dokumentu, który wypiera klasyczne TF·IDF w wyszukiwarkach pełnotekstowych.
Mikolov i in. publikują Word2Vec — gęste reprezentacje semantyczne zaczynają wypierać TF·IDF w zadaniach wymagających rozumienia synonimów.
W systemach Retrieval-Augmented Generation TF·IDF / BM25 wracają jako sparse retriever w połączeniu z embeddingami gęstymi (hybrid search).
Złożoność czasowa: O(N · L) build, O(|q| · log N) query. Złożoność przestrzenna: O(N · |V|) gęsto, O(Σ nnz) rzadko.
Sposób liczenia częstości terminu: raw / log-scaled / boolean / sublinear. Sublinear (1 + log(tf)) tłumi efekt powtórzeń tego samego słowa.
Czy stosować +1 w mianowniku, by uniknąć dzielenia przez zero dla terminów spoza zbioru treningowego (smooth IDF) oraz +1 do całego wyniku w scikit-learn.
Norma wektora dokumentu po wymnożeniu TF·IDF: l2 (jednostkowa), l1 lub brak. L2 jest standardem dla cosine similarity.
Czy traktować jako termin pojedyncze słowa (1,1), bigramy (1,2) lub dłuższe n-gramy. Większy zakres = bogatsze cechy, ale eksplodujący słownik.
Odrzucenie terminów występujących rzadziej niż min_df lub w więcej niż max_df dokumentów. Pozwala odsiać literówki / hapax legomena oraz słowa stop-list-like.
TF-IDF to algebra rzadka na liczbach całkowitych / float — CPU z SIMD (AVX) i dobrą hierarchią cache jest naturalnym targetem; brak benefitu z masywnego paralelizmu GPU.
Algorytm działa wszędzie — od mikrokontrolerów po klastry. Implementacje istnieją w Pythonie, Javie, C++, Rust, JS.
Operacje rzadkie i przeważnie I/O-bound; tensor cores nie dają tu istotnego przyspieszenia. GPU stosuje się głównie gdy TF-IDF jest cechą wejściową dla modelu trenowanego na GPU.