JSFiddle - React, Tailwind, and code Playground

by Timatnet

HTML

<div id="result"></div>

JavaScript

// Первый тест классификатора задач по проектам
String.prototype.forEach = function(f) {
    for(var i = 0; i < this.length; ++i) {
        f(this[i]);
    }
};
function log(name, data) {
    $('#result').append(name + ": " + JSON.stringify(data) + "<br/><br/>");
}
function WordList(string) {
    ',?!;[]()-\n\r.\'\\—–«»№:{}=*/<>_%。一"'.forEach(function(c) {
        string = string.split(c).join(' ');
    });
    var word_list = string.split(' '), word_list2 = [];
    for(var key in word_list) {
        var word = word_list[key];
        if(word.length > 0)
            word_list2.push(word);
    }
    return word_list2;
}

function WordListToFq(word_list) {
    log("word_list", word_list);
    var wordFq = {};
    var wordCount = 0;
    for(var key in word_list) {
        var word = word_list[key];
        if(!wordFq[word]) {
            wordFq[word] = 1;
        } else ++wordFq[word];
        ++wordCount;
    }
    for(var key in word_list) {
        var word = word_list[key];
        wordFq[word] *= 1.0/wordCount;
    }
    
    return wordFq;
}

function WordsFqRange(actionWordFq, projectWordFq) {
    var range = 0;
    for(var word in projectWordFq) {
        var actionFq = actionWordFq[word];
        var projectFq = projectWordFq[word];
        if(!actionFq) { actionFq = 0; }
        var rangeSq = actionFq-projectFq;
        range += rangeSq*rangeSq*(actionFq+projectFq);
    }
    log("actionWordFq", actionWordFq);
    log("projectWordFq", projectWordFq);
    log("range", range);
    return range;
}


// Расстояние между действием и проектом
function Range(Action, Project) {
    // Гипотеза для простой классификсации: чем больше одинаковых слов между задачей и проектом и его задачами, тем вероятней, что задача относится к этому проекту
    // Например "Дорога Путь" и "Дорога"+"Путь", против "Дорога Путь" и "Небо"+"Море"
    // Переводим задачу в набор слов, переводим проект с его задачами в набор слов
    var actionString = Action.Name + " " + Action.Notes;
  ...