From d8bf09ea9f8d1fb29e9754c5fd80b5a7bf59e4da Mon Sep 17 00:00:00 2001 From: sbosse Date: Mon, 21 Jul 2025 23:07:19 +0200 Subject: [PATCH] Mon 21 Jul 22:43:21 CEST 2025 --- js/ml/text.js | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 js/ml/text.js diff --git a/js/ml/text.js b/js/ml/text.js new file mode 100644 index 0000000..d5646fc --- /dev/null +++ b/js/ml/text.js @@ -0,0 +1,104 @@ +/** + ** ============================== + ** 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;} +}