File Coverage

blib/lib/AI/Categorizer/Learner/DecisionTree.pm
Criterion Covered Total %
statement 38 38 100.0
branch 5 6 83.3
condition 2 2 100.0
subroutine 8 8 100.0
pod 2 4 50.0
total 55 58 94.8


line stmt bran cond sub pod time code
1             package AI::Categorizer::Learner::DecisionTree;
2             $VERSION = '0.01';
3              
4 1     1   656 use strict;
  1         2  
  1         25  
5 1     1   6 use AI::DecisionTree;
  1         2  
  1         24  
6 1     1   545 use AI::Categorizer::Learner::Boolean;
  1         3  
  1         26  
7 1     1   5 use base qw(AI::Categorizer::Learner::Boolean);
  1         2  
  1         409  
8              
9             sub create_model {
10 1     1 0 2 my $self = shift;
11 1         8 $self->SUPER::create_model;
12 1         5 $self->{model}{first_tree}->do_purge;
13 1         21 delete $self->{model}{first_tree};
14             }
15              
16             sub create_boolean_model {
17 2     2 1 5 my ($self, $positives, $negatives, $cat) = @_;
18            
19 2         5 my $t = new AI::DecisionTree(noise_mode => 'pick_best',
20             verbose => $self->verbose);
21              
22 2         25 my %results;
23 2         3 for ($positives, $negatives) {
24 4         7 foreach my $doc (@$_) {
25 8 100       26 $results{$doc->name} = $_ eq $positives ? 1 : 0;
26             }
27             }
28              
29 2 100       7 if ($self->{model}{first_tree}) {
30 1         5 $t->copy_instances(from => $self->{model}{first_tree});
31 1         73 $t->set_results(\%results);
32              
33             } else {
34 1         3 for ($positives, $negatives) {
35 2         112 foreach my $doc (@$_) {
36 4         257 $t->add_instance( attributes => $doc->features->as_boolean_hash,
37             result => $results{$doc->name},
38             name => $doc->name,
39             );
40             }
41             }
42 1         106 $t->purge(0);
43 1         6 $self->{model}{first_tree} = $t;
44             }
45              
46 2 50       34 print STDERR "\nBuilding tree for category '", $cat->name, "'" if $self->verbose;
47 2         7 $t->train;
48 2         1720 return $t;
49             }
50              
51             sub get_scores {
52 8     8 0 10 my ($self, $doc) = @_;
53 8         20 local $self->{current_doc} = $doc->features->as_boolean_hash;
54 8         36 return $self->SUPER::get_scores($doc);
55             }
56              
57             sub get_boolean_score {
58 16     16 1 20 my ($self, $doc, $t) = @_;
59 16   100     55 return $t->get_result( attributes => $self->{current_doc} ) || 0;
60             }
61              
62             1;
63             __END__