Skip to content

bm25: Switch from subword tokenizer to IntlSegmenter - #12

Merged
aviatesk merged 1 commit into
masterfrom
avi/bm25-tokenizer
Dec 11, 2025
Merged

bm25: Switch from subword tokenizer to IntlSegmenter#12
aviatesk merged 1 commit into
masterfrom
avi/bm25-tokenizer

Conversation

@aviatesk

Copy link
Copy Markdown
Owner

Replace BPE subword tokenization with Intl.Segmenter for BM25 indexing. Subword tokenization breaks words into fragments (e.g., "frequency" -> "fre|que|ncy"), which hurts BM25 word matching. IntlSegmenter uses ICU word boundary detection, preserving whole words for better retrieval.

Changes:

  • Add IntlSegmenterTokenizer using built-in Intl.Segmenter API
  • Update BM25Store to use IntlSegmenterTokenizer instead of Embedder
  • Remove Embedder dependency from BM25Store
  • Add rebuildBM25Index method to IndexManager

Benchmark result (MIRACL Merged, nDCG@10):

  • Before (BGE-M3 subword): 0.8827
  • After (IntlSegmenter): 0.9023 (+2.2%)

Replace BPE subword tokenization with Intl.Segmenter for BM25 indexing.
Subword tokenization breaks words into fragments (e.g., "frequency" ->
"fre|que|ncy"), which hurts BM25 word matching. IntlSegmenter uses ICU
word boundary detection, preserving whole words for better retrieval.

Changes:
- Add IntlSegmenterTokenizer using built-in Intl.Segmenter API
- Update BM25Store to use IntlSegmenterTokenizer instead of Embedder
- Remove Embedder dependency from BM25Store
- Add rebuildBM25Index method to IndexManager

Benchmark result (MIRACL Merged, nDCG@10):
- Before (BGE-M3 subword): 0.8827
- After (IntlSegmenter): 0.9023 (+2.2%)
@aviatesk
aviatesk merged commit ea746d2 into master Dec 11, 2025
1 check passed
@aviatesk
aviatesk deleted the avi/bm25-tokenizer branch December 11, 2025 11:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant