Term Frequency › Term Frequency Sparsity Patterns

Michael BrenndoerferMarch 30, 20256 min read
Language AI HandbookAll chapters
Part 2 of 67Classical Text Representations
Chapter 11Term Frequency › Term Frequency Sparsity Patterns
Reading section 10 of 17 · Term Frequency Sparsity Patterns · 6 minSection 10 of 17 · 6 min

Book contents

Section 10 of 17 · 6 min read

Term Frequency › Term Frequency Sparsity PatternsOne section · Sections in this chapter10 / 17 ↓
Reading tools Definitions & inline links

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Article links

Make inline references clickable

One of the most important practical characteristics of term frequency matrices is their sparsity: most entries are zero. For a vocabulary of 50,000 terms and documents of average length 200 words, a typical document uses at most a few hundred distinct terms, so at least 49,800 out of 50,000 entries are zero. That's 99.6% sparsity.

This sparsity affects storage and computation as well as modeling. It is a fundamental property of language. Human vocabulary is enormous, but any individual document engages with only a tiny slice of it. A sports article uses sports vocabulary; a medical paper uses medical terminology. The overlap between their vocabularies is small, which means their term-document vectors are nearly orthogonal and most entries in each vector are zero.

Consider the storage implications concretely. A corpus of 100,000 documents with vocabulary size 100,000 would require 100,000×100,000×8100{,}000 \times 100{,}000 \times 8 bytes = 80 GB as a dense float64 matrix. That's untenable for most systems. The same data stored in Compressed Sparse Row (CSR) format might occupy only a few hundred megabytes, since only non-zero entries and their locations need to be stored. At 99.5% sparsity, the sparse representation is 200 times smaller.

The computational benefits are equally significant:

  • Storage: Dense matrices waste enormous memory on zeros. Sparse matrix formats store only non-zero values and their positions, giving orders-of-magnitude memory savings.
  • Computation: Sparse matrix operations skip zero-valued entries entirely. Computing cosine similarities between a query and 1 million documents is tractable with sparse vectors but would be prohibitive with dense ones.
  • Modeling: Many later models (linear SVMs, logistic regression, naive Bayes) work directly on sparse representations. Neural networks require dense inputs, which is why text is typically projected to dense embeddings in later stages.

Let's examine how sparsity behaves across different vocabulary sizes.

In[11]:
Code
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer

# Load a real-world corpus
newsgroups = fetch_20newsgroups(
    subset="train",
    categories=["sci.space", "rec.sport.hockey", "talk.politics.misc"],
)
texts = newsgroups.data[:500]  # Use 500 documents for speed

# Measure sparsity at different vocabulary sizes (controlled via min_df)
min_df_values = [1, 2, 5, 10, 20]
sparsity_results = []

for min_df in min_df_values:
    vec = CountVectorizer(min_df=min_df)
    X = vec.fit_transform(texts)
    vocab_size = X.shape[1]
    n_nonzero = X.nnz
    n_total = X.shape[0] * X.shape[1]
    sparsity = 1 - (n_nonzero / n_total)
    sparsity_results.append(
        {
            "min_df": min_df,
            "vocab_size": vocab_size,
            "sparsity": sparsity,
            "n_nonzero": n_nonzero,
        }
    )
Out[12]:
Console
  min_df    Vocab Size    Sparsity    Non-zero Entries
--------------------------------------------------------
       1        16,343     98.99%              82,742
       2         7,656     98.07%              74,055
       5         3,033     95.90%              62,117
      10         1,464     92.91%              51,911
      20           656     87.46%              41,144
Out[13]:
Visualization
Dual-axis chart with blue bars for vocabulary size and orange line for sparsity, both decreasing as min_df increases.
Vocabulary size and matrix sparsity as min_df increases from 1 to 20. Pruning rare terms shrinks the vocabulary from 16,343 to 656 terms while sparsity declines from 98.99% to 87.46%, revealing that rare words contribute relatively few non-zero entries.

Notice that increasing min_df dramatically reduces vocabulary size (filtering out words that appear in fewer than 20 documents cuts vocabulary by more than 80%), but sparsity decreases only modestly. This is because rare words, while numerous, contribute very few non-zero entries to the matrix. The sparsity is driven by the structure of language itself: any given document uses only a tiny fraction of the vocabulary, regardless of how large that vocabulary is.

Understanding Sparsity Through Zipf's Law

The extreme sparsity of term frequency matrices is not coincidental. It follows directly from Zipf's law, which describes a universal pattern in natural language: the frequency of any word is roughly inversely proportional to its rank in the frequency table. The most common word appears about twice as often as the second most common word, three times as often as the third most common, and so on.

Zipf's law means that a small number of words (mostly function words like "the," "a," "of," "and") account for a large fraction of all word occurrences, while the vast majority of vocabulary items are rare. In a typical English corpus, the top 100 most frequent words account for roughly 50% of all word tokens, while the bottom 50% of vocabulary items appear only once or twice. Words that appear only once in the entire corpus are called hapax legomena (Greek for "said only once"), and they typically constitute 40-60% of the vocabulary in large corpora.

This distribution has direct implications for term frequency matrices. Because most words are rare, most vocabulary entries will be zero in any given document. The sparsity you observed above (98%+) is not an artifact of the particular corpus or vocabulary size, it's a mathematical consequence of Zipf's law applied to any large natural language corpus.

Why Sparsity Matters for TF Variants

The extreme skewness of the raw TF distribution (most non-zero entries are 1 or 2) explains why log TF and boolean TF often perform similarly in practice. When the count is 1 for the majority of terms in a document, the distinction between tflog=1+log⁡(1)=1\text{tf}_{\text{log}} = 1 + \log(1) = 1 and tfbool=1\text{tf}_{\text{bool}} = 1 vanishes. Log TF only provides a different result from boolean TF for terms that appear multiple times, which is the minority of term-document pairs.

This insight has a practical implication: if you're working with a corpus where most documents are short (tweets, product titles, abstracts), boolean TF may be sufficient. The extra complexity of log TF only pays off when your documents are long enough for terms to accumulate meaningful multi-occurrence counts. For news articles, academic papers, or books, log TF is clearly preferable. For social media data, the simpler boolean representation often works just as well.