diff --git a/patterns.js b/patterns.js index bea8b9f..3cf44ef 100644 --- a/patterns.js +++ b/patterns.js @@ -2,33 +2,18 @@ const fs = require("fs"); const analysis = require("./analysis"); const knn = require("./site/js/knn"); -if (!fs.existsSync("patterns")) fs.mkdirSync("patterns"); - -if (!fs.existsSync("patterns/sorted-billa-spar.json")) { - const items = analysis.readJSON("data/latest-canonical.json.br"); - const billaSparItem = items - .filter((item) => item.store == "billa" || item.store == "spar") - .filter((item) => { - return !( - item.name.includes("Clever") || - item.name.includes("S-BUDGET") || - item.name.includes("Ja! Natürlich") || - item.name.includes("SPAR") || - item.name.includes("BILLA") - ); - }); - knn.vectorizeItems(billaSparItem); - const billaItems = billaSparItem.filter((item) => item.store == "billa"); - const sparItems = billaSparItem.filter((item) => item.store == "spar"); - - console.log(billaItems.length + " " + sparItems.length); +function similaritySort(items, filter, filterA, filterB) { + const filteredItems = items.filter(filter); + knn.vectorizeItems(filteredItems); + const itemsA = filteredItems.filter(filterA); + const itemsB = filteredItems.filter(filterB); const sortedItems = []; - sparItems.forEach((item) => (item.sorted = false)); - const total = billaItems.length; - while (billaItems.length > 0) { - const refItem = billaItems.shift(); - const similar = knn.findMostSimilarItem(refItem, sparItems); + itemsB.forEach((item) => (item.sorted = false)); + const total = itemsA.length; + while (itemsA.length > 0) { + const refItem = itemsA.shift(); + const similar = knn.findMostSimilarItem(refItem, itemsB); if (similar.item != null) { sortedItems.push(refItem); sortedItems.push(similar.item); @@ -37,32 +22,70 @@ if (!fs.existsSync("patterns/sorted-billa-spar.json")) { } if (sortedItems.length % 100 == 0) console.log(sortedItems.length / 2 + "/" + total); } + return sortedItems; +} + +function filterSimilarItems(items) { + const filteredItems = []; + for (let i = 0; i < items.length; i += 2) { + const a = items[i]; + const b = items[i + 1]; + if (b.priceHistory.some((price) => price.price == a.price) && a.quantity == b.quantity) { + filteredItems.push(a); + filteredItems.push(b); + } + } + return filteredItems; +} + +if (!fs.existsSync("patterns")) fs.mkdirSync("patterns"); + +if (!fs.existsSync("patterns/sorted-billa-spar.json")) { + const items = analysis.readJSON("data/latest-canonical.json.br"); + const sortedItems = similaritySort( + items, + (item) => { + if (!(item.store == "billa" || item.store == "spar")) return false; + return !["Clever", "S-BUDGET", "Ja! Natürlich", "SPAR", "BILLA"].some((str) => item.name.includes(str)); + }, + (item) => item.store === "billa", + (item) => item.store === "spar" + ); analysis.writeJSON("patterns/sorted-billa-spar.json", sortedItems); } -const sortedItems = analysis.readJSON("patterns/sorted-billa-spar.json"); -const filteredItems = []; -let result = ""; -for (let i = 0; i < sortedItems.length; i += 2) { - const a = sortedItems[i]; - const b = sortedItems[i + 1]; - const similarity = knn.dotProduct(a.vector, b.vector); - result += "billa " + a.name + "\n"; - result += "spar " + b.name + " " + similarity.toFixed(5) + "\n\n"; - - if (b.priceHistory.some((price) => price.price == a.price) && a.quantity == b.quantity) { - filteredItems.push(a); - filteredItems.push(b); - } +{ + const sortedItems = analysis.readJSON("patterns/sorted-billa-spar.json"); + const filteredItems = filterSimilarItems(sortedItems); + analysis.writeJSON("site/data/billa-spar-cart.json", { + name: "Markenprodukte Billa/Spar", + items: filteredItems.map((item) => { + return { store: item.store, id: item.id }; + }), + }); +} + +if (!fs.existsSync("patterns/sorted-budget.json")) { + const items = analysis.readJSON("data/latest-canonical.json.br"); + const sortedItems = similaritySort( + items, + (item) => { + if (!(item.store == "billa" || item.store == "spar")) return false; + return ["Clever", "S-BUDGET"].some((str) => item.name.includes(str)); + }, + (item) => item.store === "billa", + (item) => item.store === "spar" + ); + analysis.writeJSON("patterns/sorted-budget.json", sortedItems); +} + +{ + const sortedItems = analysis.readJSON("patterns/sorted-budget.json"); + const filteredItems = filterSimilarItems(sortedItems); + analysis.writeJSON("site/data/budget-cart.json", { + name: "Diskont-Marken Produkte Billa/Spar", + items: filteredItems.map((item) => { + return { store: item.store, id: item.id }; + }), + }); } -console.log("Sorted: " + sortedItems.length); -analysis.writeJSON("patterns/sorted-billa-spar-cart.json", { name: "Billa Spar Sortiert", items: sortedItems }); -console.log("Filtered: " + filteredItems.length); -analysis.writeJSON("patterns/sorted-billa-spar-filtered-cart.json", { name: "Billa Spar Sortiert Gefiltert", items: filteredItems }); -analysis.writeJSON("site/data/billa-spar-cart.json", { - name: "Markenprodukte Billa/Spar", - items: filteredItems.map((item) => { - return { store: item.store, id: item.id }; - }), -}); -fs.writeFileSync("patterns/sorted-billa-spar.txt", result, "utf-8"); diff --git a/site/views/items-list.js b/site/views/items-list.js index b4a7417..fa97348 100644 --- a/site/views/items-list.js +++ b/site/views/items-list.js @@ -88,7 +88,7 @@ class ItemsList extends View { elements.json.addEventListener("click", (event) => { event.preventDefault(); if (!this.model) return; - this.download(this.model.filteredItems); + this.download(this.model.filteredItems, true); }); elements.csv.addEventListener("click", (event) => {