Skip to content

Commit

Permalink
back-classify and cross-validation demo
Browse files Browse the repository at this point in the history
  • Loading branch information
erelsgl committed Oct 20, 2013
1 parent d626555 commit 2fe39b1
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 1 deletion.
24 changes: 24 additions & 0 deletions back_classify.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
console.log("limdu back classification demo start");

var limdu = require('limdu');

// Initialize a multi-label classifier with a feature extractor and past-training-samples:
var intentClassifier = new limdu.classifiers.EnhancedClassifier({
classifierType: limdu.classifiers.multilabel.BinaryRelevance.bind(0, {
binaryClassifierType: limdu.classifiers.Winnow.bind(0, {retrain_count: 10})
}),
featureExtractor: limdu.features.NGramsOfWords(1),
pastTrainingSamples: [],
});

// Train and test:
intentClassifier.trainBatch([
{input: "I want an apple", output: "apl"},
{input: "I want a banana", output: "bnn"},
{input: "I really want an apple", output: "apl"},
{input: "I want a banana very much", output: "bnn"},
]);

console.dir(intentClassifier.backClassify("apl")); // [ 'I want an apple', 'I really want an apple' ]

console.log("limdu back classification demo end");
47 changes: 47 additions & 0 deletions cross_validation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
console.log("limdu cross-validation demo start");

var limdu = require("limdu");

// define a toy dataset:
var dataset = [
{input: "I want an apple", output: "apl"},
{input: "I want a banana", output: "bnn"},
{input: "I want chips", output: "cps"},
{input: "I want an apple and a banana", output: ["apl","bnn"]},
{input: "I want a banana and chips", output: ["bnn","cps"]},
{input: "I want chips and an apple", output: ["cps","apl"]},
{input: "I want nothing", output: []},
{input: "I want a banana and chips and an apple", output: ["apl","bnn","cps"]},
{input: "I want chips and a banana and and an apple", output: ["apl","bnn","cps"]},
{input: "I want an apple and chips and a banana", output: ["apl","bnn","cps"]},
];
var numOfFolds = 5; // for k-fold cross-validation

// Define the type of classifier that we want to test:
var IntentClassifier = limdu.classifiers.EnhancedClassifier.bind(0, {
classifierType: limdu.classifiers.multilabel.BinaryRelevance.bind(0, {
binaryClassifierType: limdu.classifiers.Winnow.bind(0, {retrain_count: 10})
}),
featureExtractor: limdu.features.NGramsOfWords(1),
});

var microAverage = new limdu.utils.PrecisionRecall();
var macroAverage = new limdu.utils.PrecisionRecall();

var verbosity = 0;

limdu.utils.partitions.partitions(dataset, numOfFolds, function(trainSet, testSet) {
console.log("Training on "+trainSet.length+" samples, testing on "+testSet.length+" samples");
var classifier = new IntentClassifier();
classifier.trainBatch(trainSet);
limdu.utils.test(classifier, testSet, verbosity,
microAverage, macroAverage);
});

macroAverage.calculateMacroAverageStats(numOfFolds);
console.log("\n\nMACRO AVERAGE:"); console.dir(macroAverage.fullStats());

microAverage.calculateStats();
console.log("\n\nMICRO AVERAGE:"); console.dir(microAverage.fullStats());

console.log("limdu cross-validation demo end");
2 changes: 1 addition & 1 deletion lookup_table.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ var TextClassifier = limdu.classifiers.multilabel.BinaryRelevance.bind(0, {
// Initialize a classifier with a feature extractor and a lookup table:
var intentClassifier = new limdu.classifiers.EnhancedClassifier({
classifierType: TextClassifier,
featureExtractor: limdu.features.NGramsFromText(1), // each word ("1-gram") is a feature
featureExtractor: limdu.features.NGramsOfWords(1), // each word ("1-gram") is a feature
featureLookupTable: new limdu.features.FeatureLookupTable()
});

Expand Down

0 comments on commit 2fe39b1

Please sign in to comment.