UNPKG

node-nlp

Version:

Library for NLU (Natural Language Understanding) done in Node.js

117 lines (83 loc) 3.81 kB
/* */ var Refiner = require('../refiner').Refiner; exports.Refiner = function ENMergeDateRangeRefiner() { Refiner.call(this); this.pattern = function () { return /^\s*(to|\-)\s*$/i }; this.refine = function(text, results, opt) { if (results.length < 2) return results; var mergedResult = []; var currResult = null; var prevResult = null; for (var i=1; i<results.length; i++){ currResult = results[i]; prevResult = results[i-1]; if (!prevResult.end && !currResult.end && this.isAbleToMerge(text, prevResult, currResult)) { prevResult = this.mergeResult(text, prevResult, currResult); currResult = null; i += 1; } mergedResult.push(prevResult); } if (currResult != null) { mergedResult.push(currResult); } return mergedResult; }; this.isAbleToMerge = function(text, result1, result2) { var begin = result1.index + result1.text.length; var end = result2.index; var textBetween = text.substring(begin,end); return textBetween.match(this.pattern()); }; this.isWeekdayResult = function (result) { return result.start.isCertain('weekday') && !result.start.isCertain('day'); }; this.mergeResult = function(text, fromResult, toResult) { if (!this.isWeekdayResult(fromResult) && !this.isWeekdayResult(toResult)) { var timeKeys = {'hour': true, 'minute': true, 'second': true}; for (var key in toResult.start.knownValues) { if (!fromResult.start.isCertain(key)) { fromResult.start.assign(key, toResult.start.get(key)); } } for (var key in fromResult.start.knownValues) { if (!toResult.start.isCertain(key)) { toResult.start.assign(key, fromResult.start.get(key)); } } } if (fromResult.start.date().getTime() > toResult.start.date().getTime()) { var fromMoment = fromResult.start.moment(); var toMoment = toResult.start.moment(); if (this.isWeekdayResult(fromResult) && fromMoment.clone().add(-7, 'days').isBefore(toMoment)) { fromMoment = fromMoment.add(-7, 'days'); fromResult.start.imply('day', fromMoment.date()); fromResult.start.imply('month', fromMoment.month() + 1); fromResult.start.imply('year', fromMoment.year()); } else if (this.isWeekdayResult(toResult) && toMoment.clone().add(7, 'days').isAfter(fromMoment)) { toMoment = toMoment.add(7, 'days'); toResult.start.imply('day', toMoment.date()); toResult.start.imply('month', toMoment.month() + 1); toResult.start.imply('year', toMoment.year()); } else { var tmp = toResult; toResult = fromResult; fromResult = tmp; } } fromResult.end = toResult.start; for (var tag in toResult.tags) { fromResult.tags[tag] = true; } var startIndex = Math.min(fromResult.index, toResult.index); var endIndex = Math.max( fromResult.index + fromResult.text.length, toResult.index + toResult.text.length); fromResult.index = startIndex; fromResult.text = text.substring(startIndex, endIndex); fromResult.tags[this.constructor.name] = true; return fromResult; } };