From: Simon Cozens Date: Thu, 17 Jul 2025 08:48:16 +0000 (+0100) Subject: Compute similar families X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=abfbcca450deb1cb4294a4132eebbfb456d7704d;p=thirdparty%2Fgoogle%2Ffonts.git Compute similar families --- diff --git a/tagger2/models.js b/tagger2/models.js index cd8046d1d..fe5956f85 100644 --- a/tagger2/models.js +++ b/tagger2/models.js @@ -102,8 +102,11 @@ export class GF { let data = await loadText('family_data.json'); data = JSON.parse(data); let familyMeta = data["familyMetadataList"]; + let styleEmbeddingsData = await loadText('embeddings.json'); + let styleEmbeddings = JSON.parse(styleEmbeddingsData); familyMeta.forEach(family => { this.familyData[family.family] = family; + this.familyData[family.family].style = styleEmbeddings[family.family] || []; }); } loadFamilies() { @@ -123,6 +126,22 @@ export class GF { family(name) { return this.families.find(family => family.name === name); } + similarFamilies(name, count = 10) { + const family = this.familyData[name]; + if (!family || !family.style) { + console.warn(`Family not found: ${name}`); + return []; + } + let distances = Object.values(this.familyData).map(f => { + // Compute norm between the style embeddings + let distance = family.style.map((value, index) => { + return (value - (f.style[index] || 0)) ** 2; + }).reduce((a, b) => a + b, 0); + return [f.family, Math.sqrt(distance)]; + }); + distances.sort((a, b) => a[1] - b[1]); + return distances.slice(0, count).map(item => item[0]); + } } export class Tags {