FisherClassifier
Реализация статистического классификатора докуметов на основе линейного дискриминанта Фишера.
Предоставляет прозрачный DSL для кофигурирования с возможностью определить:
- набор категорий;
- способ определения признаков;
- коэффициент для подсчета взвешенной вероятности;
- минимальный порог для определения принадлежности к категории;
- любое хранилище статистики.
Подробнее с теорией:
Установка
Добавить в Gemfile:
gem 'fisher_classifier'
Выполнить:
$ bundle
Или поставить как гем:
$ gem install fisher_classifier
Try Before You Buy™
Попробовать можно в консоли, вот так:
$ irb
1.9.3-p448 :002 > require 'fisher_classifier'
1.9.3-p448 :003 > cl = FisherClassifier.create_in_memory
1.9.3-p448 :005 > cl.train('Nobody owns the water.','good')
=> ["Nobody", "owns", "the", "water."]
1.9.3-p448 :006 > cl.train('the quick rabbit jumps fences','good')
=> ["the", "quick", "rabbit", "jumps", "fences"]
1.9.3-p448 :007 > cl.train('buy pharmaceuticals now','bad')
=> ["buy", "pharmaceuticals", "now"]
1.9.3-p448 :008 > cl.train('make quick money at the online casino','bad')
=> ["make", "quick", "money", "at", "the", "online", "casino"]
1.9.3-p448 :009 > cl.train('the quick brown fox jumps','good')
=> ["the", "quick", "brown", "fox", "jumps"]
1.9.3-p448 :015 > cl.train('online trading with forex','bad')
=> ["online", "trading", "with", "forex"]
1.9.3-p448 :008 > cl.classify('the quick money with forex now')
=> :bad
1.9.3-p448 :009 > cl.classify('quck mouse runs from fox')
=> :good
В данном примере в качестве хранилища используется оперативная память.
DSL
Определениепризнаков
get_features do |text|
# Выделить набор признаков из текста
end
Обучение
inc_feature do |feature, category|
# Увеличить счетчик кол-ва использований признака в категории
end
inc_category do |category|
# Увеличить счетчик кол-ва использований категории
end
Классификация
# Предполагаемая вероятность (Вероятность признака, если он ни разу не появлялся)
assumed_prob 0.4
# Порог. Минимальное значение вероятности принадлежности текста в категории
fisher_threshold 0.1
categories do
# Возможные категории
end
category_count do |category|
# Кол-во использований категории
end
features_count do |feature, category|
# Кол-во использований признака в категории
end
default_category do
# Категория по умолчанию
end
Rails (Active Record)
Миграция (db/migrate/20131106143644_create_classifier_features.rb):
class CreateClassifierFeatures < ActiveRecord::Migration
def change
create_table :classifier_features do |t|
t.string :name
t.string :category
t.integer :count, default: 1
end
end
end
Модель (app/models/classifier_feature.rb):
class ClassifierFeature < ActiveRecord::Base
validates :category, presence: true
validates :name, presence: true, uniqueness: {:scope => :category}
def self.categories
[:good, :bad]
end
end
Инициалайзер:
config/initializers/classifier.rb
Использование:
$ rails c
1.9.3-p448 :009 > Classifier.train('the quick brown fox jumps', :good)
1.9.3-p448 :009 > Classifier.classify('the quick brown fox jumps', :good)
Если хочется что-то исправить
- Форкни
- Зафигач фиче-ветку (
git checkout -b my-new-feature
) - Коммить изменения (
git commit -am 'Add some feature'
) - Пуш ветку (
git push origin my-new-feature
) - Create new Pull Request