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;
...