groceries: grouping ignores 'durum tarwe' and possessive store lines (Jumbo's), so house pasta lines up across stores
All checks were successful
Deploy production / deploy (push) Successful in 2m49s
All checks were successful
Deploy production / deploy (push) Successful in 2m49s
This commit is contained in:
@@ -293,14 +293,18 @@ const stem = (t: string) =>
|
||||
|
||||
/** Meaningful name tokens: no brand, store name, size, packaging or stop words. */
|
||||
export function nameTokens(title: string, brand?: string | null): string[] {
|
||||
let s = fold(title).replace(/&/g, ' en ').replace(SIZE_IN_NAME, ' ');
|
||||
let s = fold(title)
|
||||
.replace(/&/g, ' en ')
|
||||
.replace(SIZE_IN_NAME, ' ')
|
||||
.replace(/\bdurum\s*-?\s*(?:tarwe)?\b/g, ' '); // "Penne durum tarwe" is plain penne
|
||||
const drop = new Set<string>();
|
||||
for (const w of [brand ?? '', ...STORE_WORDS])
|
||||
for (const t of fold(w).split(/[^a-z0-9]+/)) if (t) drop.add(t);
|
||||
for (const t of fold(w).replace(/['’]/g, '').split(/[^a-z0-9]+/)) if (t) drop.add(t);
|
||||
s = s.replace(/['’]/g, '').replace(/[^a-z0-9%+]+/g, ' ');
|
||||
const out: string[] = [];
|
||||
for (const raw of s.split(' ')) {
|
||||
if (!raw || drop.has(raw) || STOP.has(raw)) continue;
|
||||
if (/^(?:ah|jumbo|plus)s$/.test(raw)) continue; // possessive store lines: Jumbo's
|
||||
if (/^\d+$/.test(raw) && raw.length > 2) continue; // stray numbers (article codes)
|
||||
const t = stem(raw);
|
||||
if (!out.includes(t)) out.push(t);
|
||||
|
||||
Reference in New Issue
Block a user