This file provides guidance to coding agents when working with code in this repository.
Ruby gem providing text classification via two algorithms:
- Bayes (
Classifier::Bayes) - Naive Bayesian classification - LSI (
Classifier::LSI) - Latent Semantic Indexing for semantic classification, clustering, and search
# Compile native C extension
bundle exec rake compile
# Run all tests (compiles first)
bundle exec rake test
# Run a single test file
ruby -Ilib test/bayes/bayesian_test.rb
ruby -Ilib test/lsi/lsi_test.rb
# Run tests with pure Ruby (no native extension)
NATIVE_VECTOR=true bundle exec rake test
# Run benchmarks
bundle exec rake benchmark
bundle exec rake benchmark:compare
# Interactive console
bundle exec rake console
# Generate documentation
bundle exec rake docCHANGELOG.md records every user-visible change. Add an entry in the same pull
request that makes the change. A reviewer who finds a behavior change without an
entry asks for one.
Write entries for the person who installs the gem, not for the person who wrote the commit:
- Describe the behavior that ships, not the path taken to reach it. A bug that a reviewer found and the author fixed before release never existed for a user.
- Put the entry under a
## X.Y.Z - YYYY-MM-DDheading. Use the released version number without avprefix, and an ISO date. - Start a breaking change with
**Breaking:**and say what a caller must now do differently. - Name the public constant, method, or command that changed, and show the command or call when an example makes it concrete.
- Skip changes a user cannot observe: dependency bumps for development, lint configuration, CI, and internal refactors.
- Order the entries within a release by how much they matter to a user.
Choose the version with semantic versioning: a breaking change is a major, a new feature is a minor, and a fix alone is a patch.
Update lib/classifier/version.rb, CHANGELOG.md, and Gemfile.lock. Run
bundle exec rake and bundle exec rubocop. Then commit and merge to master.
Publish by pushing an annotated version tag:
git tag -a v2.7.0 -m "Version 2.7.0"
git push origin v2.7.0The Release workflow runs CI, builds the gem, publishes it through RubyGems
trusted publishing, and creates the GitHub release. Never run gem push from a
workstation.
Bayesian Classifier (lib/classifier/bayes.rb)
- Train with
train(category, text)or dynamic methods liketrain_spam(text) - Classify with
classify(text)returning the best category - Uses log probabilities for numerical stability
LSI Classifier (lib/classifier/lsi.rb)
- Uses Singular Value Decomposition (SVD) for semantic analysis
- Native C extension for 5-50x faster matrix operations; falls back to pure Ruby
- Key operations:
add_item,classify,find_related,search auto_rebuildoption controls automatic index rebuilding after changes
String Extensions (lib/classifier/extensions/word_hash.rb)
word_hash/clean_word_hash- tokenize text to stemmed word frequenciesCORPUS_SKIP_WORDS- stopwords filtered during tokenization- Uses
fast-stemmergem for Porter stemming
Vector Extensions (lib/classifier/extensions/vector.rb)
- Pure Ruby SVD implementation (
Matrix#SV_decomp) - used as fallback - Vector normalization and magnitude calculations
LSI uses a native C extension for fast linear algebra operations:
Classifier::Linalg::Vector- Vector operations (alloc, normalize, dot product)Classifier::Linalg::Matrix- Matrix operations (alloc, transpose, multiply)- Jacobi SVD implementation for singular value decomposition
Check current backend: Classifier::LSI.backend returns :native or :ruby
Force pure Ruby: NATIVE_VECTOR=true bundle exec rake test
Internal data structure storing:
word_hash- term frequenciesraw_vector/raw_norm- initial vector representationlsi_vector/lsi_norm- reduced dimensionality representation after SVD