node-nlp
Version:
Library for NLU (Natural Language Understanding) done in Node.js
128 lines (127 loc) • 5.35 kB
JavaScript
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var IntentRecognizer_1 = require("./IntentRecognizer");
var request = require("request");
var url = require("url");
var LuisRecognizer = (function (_super) {
__extends(LuisRecognizer, _super);
function LuisRecognizer(models) {
var _this = _super.call(this) || this;
if (typeof models == 'string') {
_this.models = { '*': models };
}
else {
_this.models = (models || {});
}
return _this;
}
LuisRecognizer.prototype.onRecognize = function (context, callback) {
var result = { score: 0.0, intent: null };
if (context && context.message && context.message.text) {
var locale = context.locale || '*';
var dashPos = locale.indexOf('-');
var parentLocale = dashPos > 0 ? locale.substr(0, dashPos) : '*';
var model = this.models[locale] || this.models[parentLocale] || this.models['*'];
if (model) {
var utterance = context.message.text;
LuisRecognizer.recognize(utterance, model, function (err, intents, entities, compositeEntities) {
if (!err) {
result.intents = intents;
result.entities = entities;
result.compositeEntities = compositeEntities;
var top;
intents.forEach(function (intent) {
if (top) {
if (intent.score > top.score) {
top = intent;
}
}
else {
top = intent;
}
});
if (top) {
result.score = top.score;
result.intent = top.intent;
switch (top.intent.toLowerCase()) {
case 'builtin.intent.none':
case 'none':
result.score = 0.1;
break;
}
}
callback(null, result);
}
else {
callback(err, null);
}
});
}
else {
callback(new Error("LUIS model not found for locale '" + locale + "'."), null);
}
}
else {
callback(null, result);
}
};
LuisRecognizer.recognize = function (utterance, modelUrl, callback) {
try {
var uri = url.parse(modelUrl, true);
uri.query['q'] = utterance || '';
if (uri.search) {
delete uri.search;
}
request.get(url.format(uri), function (err, res, body) {
var result;
try {
if (res && res.statusCode === 200) {
result = JSON.parse(body);
result.intents = result.intents || [];
result.entities = result.entities || [];
result.compositeEntities = result.compositeEntities || [];
if (result.topScoringIntent && result.intents.length == 0) {
result.intents.push(result.topScoringIntent);
}
if (result.intents.length == 1 && typeof result.intents[0].score !== 'number') {
result.intents[0].score = 1.0;
}
}
else {
err = new Error(body);
}
}
catch (e) {
err = e;
}
try {
if (!err) {
callback(null, result.intents, result.entities, result.compositeEntities);
}
else {
var m = err.toString();
callback(err instanceof Error ? err : new Error(m));
}
}
catch (e) {
console.error(e.toString());
}
});
}
catch (err) {
callback(err instanceof Error ? err : new Error(err.toString()));
}
};
return LuisRecognizer;
}(IntentRecognizer_1.IntentRecognizer));
exports.LuisRecognizer = LuisRecognizer;
;