initial pass at term grouping function
This commit is contained in:
parent
984b5326a9
commit
0498ea5d36
@ -91,6 +91,71 @@ function undupeTermDefs(definitions) {
|
|||||||
return definitionsUnique;
|
return definitionsUnique;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function groupTermDefs(definitions) {
|
||||||
|
const groups = {};
|
||||||
|
let groupCount = 0;
|
||||||
|
|
||||||
|
for (const definition of definitions) {
|
||||||
|
const key = [definition.source, definition.expression].concat(definition.reasons);
|
||||||
|
if (definition.reading) {
|
||||||
|
key.push(definition.reading);
|
||||||
|
}
|
||||||
|
|
||||||
|
const group = groups[key];
|
||||||
|
if (group) {
|
||||||
|
group.push(definition);
|
||||||
|
} else {
|
||||||
|
groups[key] = [definition];
|
||||||
|
++groupCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const results = [];
|
||||||
|
for (const key in groups) {
|
||||||
|
const groupDefs = sortTermDefs(groups[key]);
|
||||||
|
|
||||||
|
const tagCounts = {};
|
||||||
|
for (const tag of groupDefs.map(def => def.tags)) {
|
||||||
|
const count = tagsGlobal[tag.name] || 0;
|
||||||
|
tagCounts[tag.name] = count + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const tagsGlobal = [];
|
||||||
|
const tagsGlobalAdded = {};
|
||||||
|
let maxScore = Number.MIN_SAFE_INTEGER;
|
||||||
|
|
||||||
|
for (const definition of groupDefs) {
|
||||||
|
const tagsLocal = [];
|
||||||
|
for (const tag of definition.tags) {
|
||||||
|
if (tagCounts[tag.name] === groupCount) {
|
||||||
|
if (!tagsGlobalAdded[tag.name]) {
|
||||||
|
tagsGlobalAdded[tag.name] = true;
|
||||||
|
tagsGlobal.push(tag);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tagsLocal.push(tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
definition.tags = tagsLocal;
|
||||||
|
maxScore = Math.max(maxScore, definition.score);
|
||||||
|
}
|
||||||
|
|
||||||
|
const firstDef = groupDefs[0];
|
||||||
|
results.push({
|
||||||
|
definitions: groupDefs,
|
||||||
|
expression: firstDef.expression,
|
||||||
|
reading: firstDef.reading,
|
||||||
|
reasons: firstDef.reasons,
|
||||||
|
score: maxScore,
|
||||||
|
source: firstDef.source,
|
||||||
|
tags: sortTags(tagsGlobal),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return sortTermDefs(results);
|
||||||
|
}
|
||||||
|
|
||||||
function buildDictTag(name) {
|
function buildDictTag(name) {
|
||||||
return sanitizeTag({name, category: 'dictionary', order: 100});
|
return sanitizeTag({name, category: 'dictionary', order: 100});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user