NAME
Text::AI::CRM114 - Perl interface for CRM114
SYNOPSIS
use Text::AI::CRM114;
my $db = Text::AI::CRM114->new(
classes => ["Alice", "Macbeth"]
);
$db->learn("Alice", "Alice was beginning to ...");
$db->learn("Macbeth", "When shall we three meet again ...");
my @ret = $db->classify("The Mole had been working very hard all the morning ...");
say "Best classification is $ret[1]" unless ($ret[0] != Text::AI::CRM114::OK);
DESCRIPTION
This module provides a simple Perl interface to libcrm114
, a library that implements several text classification algorithms.
CONSTANTS
libcrm114
uses several constants as status return values and to set the classification algorithm of a new datablock. -- These constants are accessible in this module's namespace, for example Text::AI::CRM114::OK
and Text::AI::CRM114::OSB_WINNOW
.
METHODS
- Text::AI::CRM114->new(%options)
-
Creates a new instance. Options and their default values are:
- flags => Text::AI::CRM114::OSB_BAYES
-
sets the classification algorithm, recommended values are
Text::AI::CRM114::OSB_BAYES
,Text::AI::CRM114::OSB_WINNOW
, orText::AI::CRM114::HYPERSPACE
.libcrm114
includes some more algorithms (SVM, PCA, FSCM) which may or may not be production ready. - datasize => 0
-
the intended memory size for learned data.
Note that this parameter has no immediate effect!
libcrm114
always creates its data structure with a default size (depending on the algorithm, 8M for OSB); this parameter is only used for some algorithms that might grow their dataset after learning many items. - classes => ['A', 'B']
-
a list of classes passed by reference.
- Text::AI::CRM114->readfile($filename)
-
Creates a new instance by reading a previously saved CRM114 DB from
$filename
. - $db->getclasses()
-
Returns a hash reference to the DB's classes. This hash associates the class names (keys) with the internal integer index (values).
- $db->writefile($filename)
-
Writes the DB into a (binary) file.
- $db->learn($class, $text)
-
Learn some text of a given class.
- $db->classify($text [, $verbatim] )
-
Classify the text.
The normal mode (without the optional
$verbatim
flag) adjusts the return values to be useful with two classes (e.g. spam/ham).If the
$verbatim
flag is true, then the values are passed unchanged as they come fromlibcrm114
. See section "Classify Verbatim" below for more details and an example.Returns a list of five scalar values:
- $err
-
A numeric error code, should be
Text::AI::CRM114::libcrm114::OK
- $class
-
The name of the best matching class.
- $prob
-
The success probability. Normally the probability of the matching class (with 0.5 <= $prob <= 1)
- $pR
-
The logarithmic probability ratio i.e.
log10($prob) - log10(1-$prob)
(theorethic range is 0 <= $pR <= 340, limited by floating point precision; but in practice a p = .99 yields a pR = 2, so high values are rather unusual).
CLASSIFY VERBATIM
The following example shows the effect of the $verbatim
flag to classify()
:
my $db = Text::AI::CRM114->new( classes => ["Macbeth", "Alice"]);
$db->learn("Macbeth", SampleText::Macbeth());
$db->learn("Alice", SampleText::Alice());
my @ret = $db->classify(SampleText::Willows_frag(), 1);
printf "verbatim mode: err %d, class %s, prob %.3f, pR %.3f\n", @ret;
@ret = $db->classify(SampleText::Willows_frag());
printf "normal mode: err %d, class %s, prob %.3f, pR %.3f\n", @ret;
Output is:
verbatim mode: err 0, class Alice, prob 0.103, pR -0.938
normal mode: err 0, class Alice, prob 0.897, pR 0.938
The background here is that libcrm114
may use many classes, but on top of that all classes have "success" and "failure" bits (as a meta-category if you will). By default the first class indicates "success" and all other classes are "failures".
This is important because the probability and the probability ratio (pR) of a result is not given relative to a single class, but relative to the "success" meta-category. So in the verbatim mode the probability of 0.103 is obviously not the probability of the best class p(Alice), but it is the probability of "success" p(success). If the first class is the best classification then these numbers are the same (because the class and the meta-category align); they are only different if another class is found to be the best match.
In order to simplify the expected most common usage with two classes, this module inverts the values as needed.
The $verbatim
flag just provides access to the original values for those who need them. If you use more than two classes then you should look into libcrm114
for the exact meaning of the result values, and you might want to add accessor methods to set the "success"/"failure" flags for single classes.
ISSUES
This is my first attempt to write a Perl module, so all hints and improvements are appreciated.
I wonder if we should ensure Text::AI::CRM114::OK maps to 0, as this makes the caller's return value checking easier. Currently this is trivial because it already is 0 in libcrm114
. If that should change we would have to insert a rewrite into every XS call to a C function (ugly, but maybe worth it).
I am still not sure if the C memory management works correctly.
Another issue is Unicode support, which is missing in libcrm114
, so it might be a good thing to convert unicode strings into some 8-bit encoding. As long as no string contains \0-values nothing bad[tm] will happen, but I assume that Unicode strings will internally cause wrong tokenization (this should be checked in libtre
).
SEE ALSO
CRM114 homepage: http://crm114.sourceforge.net/
AI::CRM114, a module using the crm language interpreter: https://metacpan.org/module/AI::CRM114
HISTORY
v0.05 change new() parameter passing from array to hash, set DB userid, move 2nd namespace
v0.04 remove crm114_strerror, which is not in libcrm114 tarball
v0.03 initial CPAN release
v0.02 initial push to github
AUTHOR
Martin Schuette, <info@mschuette.name>
COPYRIGHT AND LICENSE
Perl module: Copyright (C) 2012 by Martin Schuette
libcrm114: Copyright (C) 2009-2010 by William S. Yerazunis
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3.