UNPKG

node-nlp

Version:

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

420 lines (419 loc) 12.5 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for lib/classifiers/binary-neural-network-classifier.js</title> <meta charset="utf-8" /> <link rel="stylesheet" href="..\..\prettify.css" /> <link rel="stylesheet" href="..\..\base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type='text/css'> .coverage-summary .sorter { background-image: url(..\..\sort-arrow-sprite.png); } </style> </head> <body> <div class='wrapper'> <div class='pad1'> <h1> <a href="..\..\index.html">All files</a> / <a href="index.html">lib/classifiers</a> binary-neural-network-classifier.js </h1> <div class='clearfix'> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Statements</span> <span class='fraction'>39/39</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Branches</span> <span class='fraction'>26/26</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Functions</span> <span class='fraction'>11/11</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Lines</span> <span class='fraction'>37/37</span> </div> </div> </div> <div class='status-line high'></div> <pre><table class="coverage"> <tr><td class="line-count quiet">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">31x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">194x</span> <span class="cline-any cline-yes">194x</span> <span class="cline-any cline-yes">193x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">194x</span> <span class="cline-any cline-yes">194x</span> <span class="cline-any cline-yes">194x</span> <span class="cline-any cline-yes">194x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">884x</span> <span class="cline-any cline-yes">617x</span> <span class="cline-any cline-yes">617x</span> <span class="cline-any cline-yes">6x</span> <span class="cline-any cline-yes">3x</span> <span class="cline-any cline-yes">3x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">611x</span> <span class="cline-any cline-yes">608x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">617x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">52x</span> <span class="cline-any cline-yes">366x</span> <span class="cline-any cline-yes">52x</span> <span class="cline-any cline-yes">366x</span> <span class="cline-any cline-yes">999x</span> <span class="cline-any cline-yes">99x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">999x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">52x</span> <span class="cline-any cline-yes">52x</span> <span class="cline-any cline-yes">99x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">52x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">57x</span> <span class="cline-any cline-yes">57x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">3x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">56x</span> <span class="cline-any cline-yes">453x</span> <span class="cline-any cline-yes">453x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1066x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">31x</span> <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/* * Copyright (c) AXA Shared Services Spain S.A. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ &nbsp; const { NeuralNetwork } = require('brain.js'); &nbsp; /** * Classifier using Brain.js Neural Network */ class BinaryNeuralNetworkClassifier { /** * Constructor of the class. * @param {Object} settings Settings for the instance. */ constructor(settings) { this.settings = settings || {}; if (!this.settings.config) { this.settings.config = { activation: 'leaky-relu', hiddenLayers: [], learningRate: 0.1, errorThresh: 0.0005, }; } this.totalTimeout = this.settings.totalTimeout || 2 * 60 * 1000; this.labelTimeout = this.settings.labelTimeout; this.labels = []; this.classifierMap = {}; } &nbsp; /** * If a trainer does not exists for a label, create it. * @param {*} label */ addTrainer(label) { if (!this.classifierMap[label]) { this.labels.push(label); if (this.labelTimeout &amp;&amp; this.labelTimeout &gt; 0) { if (this.totalTimeout &amp;&amp; this.totalTimeout &gt; 0) { const partialTimeout = this.totalTimeout / this.labels.length; this.settings.config.timeout = Math.min( this.totalTimeout, partialTimeout ); } } else if (this.totalTimeout &amp;&amp; this.totalTimeout &gt; 0) { this.settings.config.timeout = this.totalTimeout / this.labels.length; } this.classifierMap[label] = new NeuralNetwork(this.settings.config); } } &nbsp; /** * Train the classifier given a dataset. * @param {Object} dataset Dataset with features and outputs. */ async trainBatch(dataset) { const datasetMap = {}; dataset.forEach(item =&gt; this.addTrainer(item.output)); dataset.forEach(item =&gt; { this.labels.forEach(label =&gt; { if (!datasetMap[label]) { datasetMap[label] = []; } datasetMap[label].push({ input: item.input, output: [item.output === label ? 1 : 0], }); }); }); const promises = []; Object.keys(datasetMap).forEach(label =&gt; { promises.push(this.classifierMap[label].trainAsync(datasetMap[label])); }); return Promise.all(promises); } &nbsp; /** * Given a sample, return the classification. * @param {Object} sample Input sample. * @returns {Object} Classification output. */ classify(sample) { const scores = []; if (Object.keys(sample).length === 0) { this.labels.forEach(label =&gt; { scores.push({ label, value: 0.5 }); }); } else { Object.keys(this.classifierMap).forEach(label =&gt; { const score = this.classifierMap[label].run(sample); scores.push({ label, value: score[0] }); }); } return scores.sort((x, y) =&gt; y.value - x.value); } } &nbsp; module.exports = BinaryNeuralNetworkClassifier; &nbsp;</pre></td></tr> </table></pre> <div class='push'></div><!-- for sticky footer --> </div><!-- /wrapper --> <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Fri Jan 25 2019 22:43:23 GMT+0100 (GMT+01:00) </div> </div> <script src="..\..\prettify.js"></script> <script> window.onload = function () { if (typeof prettyPrint === 'function') { prettyPrint(); } }; </script> <script src="..\..\sorter.js"></script> </body> </html>