105 lines
2.5 KiB
JavaScript
105 lines
2.5 KiB
JavaScript
/**
|
|
** ==============================
|
|
** O O O OOOO
|
|
** O O O O O O
|
|
** O O O O O O
|
|
** OOOO OOOO O OOO OOOO
|
|
** O O O O O O O
|
|
** O O O O O O O
|
|
** OOOO OOOO O O OOOO
|
|
** ==============================
|
|
** Dr. Stefan Bosse http://www.bsslab.de
|
|
**
|
|
** COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED
|
|
** BY THE AUTHOR(S).
|
|
** THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED,
|
|
** MODIFIED, OR OTHERWISE USED IN A CONTEXT
|
|
** OUTSIDE OF THE SOFTWARE SYSTEM.
|
|
**
|
|
** $AUTHORS: Stefan Bosse
|
|
** $INITIAL: (C) 2006-2019 BSSLAB
|
|
** $CREATED: 5-3-19 by sbosse.
|
|
** $VERSION: 1.1.1
|
|
**
|
|
** $INFO:
|
|
**
|
|
** JavaScript AIOS Machine Learning API: Text analysis
|
|
**
|
|
** Portable model
|
|
**
|
|
** $ENDOFINFO
|
|
*/
|
|
'use strict';
|
|
var Io = Require('com/io');
|
|
var Comp = Require('com/compat');
|
|
var current=none;
|
|
var Aios=none;
|
|
|
|
function similarity(s1, s2) {
|
|
var longer = s1;
|
|
var shorter = s2;
|
|
if (s1.length < s2.length) {
|
|
longer = s2;
|
|
shorter = s1;
|
|
}
|
|
var longerLength = longer.length;
|
|
if (longerLength == 0) {
|
|
return 1.0;
|
|
}
|
|
return (longerLength - editDistance(longer, shorter)) / parseFloat(longerLength);
|
|
}
|
|
function editDistance(s1, s2) {
|
|
s1 = s1.toLowerCase();
|
|
s2 = s2.toLowerCase();
|
|
|
|
var costs = new Array();
|
|
for (var i = 0; i <= s1.length; i++) {
|
|
var lastValue = i;
|
|
for (var j = 0; j <= s2.length; j++) {
|
|
if (i == 0)
|
|
costs[j] = j;
|
|
else {
|
|
if (j > 0) {
|
|
var newValue = costs[j - 1];
|
|
if (s1.charAt(i - 1) != s2.charAt(j - 1))
|
|
newValue = Math.min(Math.min(newValue, lastValue),
|
|
costs[j]) + 1;
|
|
costs[j - 1] = lastValue;
|
|
lastValue = newValue;
|
|
}
|
|
}
|
|
}
|
|
if (i > 0)
|
|
costs[s2.length] = lastValue;
|
|
}
|
|
return costs[s2.length];
|
|
}
|
|
|
|
|
|
// Create a model
|
|
function create(strings,options) {
|
|
return {
|
|
data:strings
|
|
}
|
|
}
|
|
|
|
// Classify one sample; return best matching string
|
|
function classify(model,sample) {
|
|
var matches = model.data.map(function (h) {
|
|
return {
|
|
match:similarity(h,sample),
|
|
string:h
|
|
}
|
|
}).sort(function (a,b) {
|
|
if (a.match < b.match) return 1; else return -1;
|
|
});
|
|
return matches[0];
|
|
}
|
|
|
|
module.exports = {
|
|
classify:classify,
|
|
create:create,
|
|
similarity:similarity,
|
|
current:function (module) { current=module.current; Aios=module;}
|
|
}
|