Text classification in Ruby. Five algorithms, native performance, streaming support.
Documentation · Tutorials · API Reference
| This Gem | Other Forks | |
|---|---|---|
| Algorithms | ✅ 5 classifiers | ❌ 2 only |
| Incremental LSI | ✅ Brand's algorithm (no rebuild) | ❌ Full SVD rebuild on every add |
| LSI Performance | ✅ Native C extension (5-50x faster) | ❌ Pure Ruby or requires GSL |
| Streaming | ✅ Train on multi-GB datasets | ❌ Must load all data in memory |
| Persistence | ✅ Pluggable (file, Redis, S3, SQL, Custom) | ❌ Marshal only |
gem'classifier'Or install via Homebrew for CLI-only usage:
brew install cardmagic/tap/classifierClassify text instantly with pre-trained models—no coding required:
# Detect spam
classifier -r sms-spam-filter "You won a free iPhone"# => spam# Analyze sentiment
classifier -r imdb-sentiment "This movie was absolutely amazing"# => positive# Detect emotions
classifier -r emotion-detection "I am so happy today"# => joy# List all available models
classifier modelsTrain your own model:
# Train from files
classifier train positive reviews/good/*.txt
classifier train negative reviews/bad/*.txt
# Classify new text
classifier "Great product, highly recommend"# => positiveInstall as a plugin to get skills (auto-invoked) and slash commands:
# Add the marketplace
claude plugin marketplace add cardmagic/ai-marketplace
# Install the plugin
claude plugin install classifier@cardmagicThis gives you:
- Skill: Claude automatically classifies text when you ask about spam, sentiment, or emotions
- Slash commands:
/classifier:classify,/classifier:train,/classifier:models
classifier=Classifier::Bayes.new(:spam,:ham)classifier.train(spam: "Buy viagra cheap pills now")classifier.train(spam: "You won million dollars prize")classifier.train(ham: ["Meeting tomorrow at 3pm","Quarterly report attached"])classifier.classify("Cheap pills!")# => "Spam"classifier=Classifier::LogisticRegression.new(:positive,:negative)classifier.train(positive: "love amazing great wonderful")classifier.train(negative: "hate terrible awful bad")classifier.classify("I love it!")# => "Positive"lsi=Classifier::LSI.newlsi.add(dog: "dog puppy canine bark fetch",cat: "cat kitten feline meow purr")lsi.classify("My puppy barks")# => "dog"knn=Classifier::KNN.new(k: 3)%w[laptopcodingsoftwaredeveloperprogramming].each{ |w| knn.add(tech: w)}%w[footballbasketballsoccergoalteam].each{ |w| knn.add(sports: w)}knn.classify("programming code")# => "tech"tfidf=Classifier::TFIDF.newtfidf.fit(["Ruby is great","Python is great","Ruby on Rails"])tfidf.transform("Ruby programming")# => {:rubi => 1.0}Add documents without rebuilding the entire index—400x faster for streaming data:
lsi=Classifier::LSI.new(incremental: true)lsi.add(tech: ["Ruby is elegant","Python is popular"])lsi.build_index# These use Brand's algorithm—no full rebuildlsi.add(tech: "Go is fast")lsi.add(tech: "Rust is safe")classifier.storage=Classifier::Storage::File.new(path: "model.json")classifier.saveloaded=Classifier::Bayes.load(storage: classifier.storage)classifier.train_from_stream(:spam,File.open("spam_corpus.txt"))Native C extension provides 5-50x speedup for LSI operations:
| Documents | Speedup |
|---|---|
| 10 | 25x |
| 20 | 50x |
rake benchmark:compare # Run your own comparisonbundle install
rake compile # Build native extension
rake test# Run tests- Lucas Carlson - lucas@rufy.com
- David Fayram II - dfayram@gmail.com
- Cameron McBride - cameron.mcbride@gmail.com
- Ivan Acosta-Rubio - ivan@softwarecriollo.com