]> git.ipfire.org Git - thirdparty/google/fonts.git/commitdiff
Compute similar families
authorSimon Cozens <simon@simon-cozens.org>
Thu, 17 Jul 2025 08:48:16 +0000 (09:48 +0100)
committerSimon Cozens <simon@simon-cozens.org>
Thu, 17 Jul 2025 09:08:25 +0000 (10:08 +0100)
tagger2/models.js

index cd8046d1db9959bb169047b0bf57632584c681a8..fe5956f85af96b05d97198cd719f41e41b373f49 100644 (file)
@@ -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 {