mysamai/mysam-core

View on GitHub
lib/services/classify/classify.class.js

Summary

Maintainability
A
1 hr
Test Coverage
const BrainJSClassifier = require('natural-brain');
const maxBy = require('lodash/maxBy');
const debounce = require('lodash/debounce');
const debug = require('debug')('mysam-core:classifier-service');

// We want to classify every word
BrainJSClassifier.disableStopWords();

module.exports = class Classifier {
  constructor (options = {}) {
    this.classifier = new BrainJSClassifier(Object.assign({
      iterations: 2000
    }, options));
  }

  retrain () {
    const retrain = this._retrain || (this._retrain = debounce(() => {
      debug('Retraining classifier');
      this.classifier.retrain();
      if (typeof this.emit === 'function') {
        debug(`Sending 'trained' event`);
        this.emit('trained', this.classifier);
      }
    }, 250));

    retrain.call(this);
  }

  removeTraining (training) {
    this.classifier.removeDocument(training.text, training.action._id);
    this.retrain();
  }

  addTraining (training) {
    this.classifier.addDocument(training.text, training.action._id);
    this.retrain();
  }

  create ({ text }) {
    const classifications = this.classifier.getClassifications(text);

    debug('Classifications from natural-brain', classifications);

    const classification = maxBy(classifications, current => current.value);
    const result = {
      text,
      action: classification.label,
      confidence: classification.value
    };

    debug('Created classification', result);

    return Promise.resolve(result);
  }
};