lib/omnicat/classifier.rb in omnicat-0.2.2 vs lib/omnicat/classifier.rb in omnicat-0.3.0
- old
+ new
@@ -8,11 +8,11 @@
# classification strategy
attr_accessor :strategy
# delegate category methods
- def_delegators :@strategy, :add_category, :add_categories
+ def_delegators :@strategy, :add_category, :add_categories, :category_size_limit
# delegate training methods
def_delegators :@strategy, :train, :train_batch, :untrain, :untrain_batch
# delegate classification methods
@@ -24,33 +24,82 @@
# nodoc
def initialize(classifier)
@strategy = classifier
end
+ # Changes classifier strategy and train new strategy if needed
+ #
def strategy=(classifier)
is_interchangeable?(classifier)
- if @strategy && classifier.doc_count == 0
+ if @strategy && classifier.category_count == 0
previous_strategy = @strategy
@strategy = classifier
- # pass previous strategy contents into the new one
- previous_strategy.categories.each do |category_name, category|
- @strategy.add_category(category_name)
- category.docs.each do |_, doc|
- doc.count.times do
- @strategy.train(category_name, doc.content)
- end
- end
- end
+ convert_categories_with_docs(previous_strategy)
else
@strategy = classifier
end
end
private
+ # nodoc
+ def convert_categories_with_docs(previous_strategy)
+ if previous_strategy.categories.is_a?(Hash)
+ convert_categories_hash(previous_strategy.categories)
+ else
+ convert_categories_array(previous_strategy.categories)
+ end
+ end
+
+ # nodoc
+ def convert_categories_array(categories)
+ categories.each do |category|
+ convert_category(category)
+ end
+ end
+
+ # nodoc
+ def convert_categories_hash(categories)
+ categories.each do |_, category|
+ convert_category(category)
+ end
+ end
+
+ # nodoc
+ def convert_category(category)
+ @strategy.add_category(category.name)
+ if category.docs.is_a?(Hash)
+ convert_docs_hash(category.name, category.docs)
+ else
+ convert_docs_array(category.name, category.docs)
+ end
+ end
+
+ # nodoc
+ def convert_docs_array(category_name, docs)
+ docs.each do |doc|
+ convert_doc(category_name, doc)
+ end
+ end
+
+ # nodoc
+ def convert_docs_hash(category_name, docs)
+ docs.each do |_, doc|
+ convert_doc(category_name, doc)
+ end
+ end
+
+ # nodoc
+ def convert_doc(category_name, doc)
+ doc.count.times do
+ @strategy.train(category_name, doc.content)
+ end
+ end
+
+ # nodoc
def is_interchangeable?(classifier)
- if classifier.category_size_limit
+ unless classifier.category_size_limit == 0
if @strategy.category_count > classifier.category_size_limit
- raise StandardError,
+ raise StandardError,
'New classifier category size limit is less than the current classifier\'s category count.'
end
end
end
end
\ No newline at end of file