self::NONE, 'score' => 0, 'signals' => [], ]; } $score = 0; $signals = []; $strongSignals = [ 'suche', 'habt', 'gibt', 'zeig', 'welche', 'vergleich', 'alternativ', 'find', 'shop', 'sku', 'Artikel', 'Gerät', 'testomat', 'indikator' ]; foreach ($strongSignals as $signal) { if (str_contains($p, strtolower($signal))) { $score += 3; $signals[] = $signal; } } if(preg_match('#\d{3,10}#', $p)){ $score += 2; $signals[] = 'sku'; } if (preg_match('/\b\d+(?:[.,]\d+)?\s*(euro|€|eur|teuer|preis|kosten)\b/u', $p) === 1) { $score += 2; $signals[] = 'price'; } if (preg_match('/\b(größe|groesse|grösse)\s*[a-z0-9.-]+\b/u', $p) === 1) { $score += 2; $signals[] = 'size'; } if (preg_match('/\b(xs|s|m|l|xl|xxl|xxxl)\b/u', $p) === 1) { $score += 1; $signals[] = 'size_token'; } if (preg_match('/\b(schwarz|weiß|weiss|rot|blau|grün|gruen|gelb|grau|beige|rosa|pink|orange|braun)\b/u', $p) === 1) { $score += 1; $signals[] = 'color'; } $advisorySignals = [ 'passt', 'eignet', 'besser', 'besten', 'geeignet', 'empfiehl', 'empfehl', ]; foreach ($advisorySignals as $signal) { if (str_contains($p, $signal)) { $score += 1; $signals[] = 'advisory:' . $signal; } } $signals = array_values(array_unique($signals)); if ($score >= 3) { return [ 'intent' => self::PRODUCT_SEARCH, 'score' => $score, 'signals' => $signals, ]; } if ($score >= 2) { return [ 'intent' => self::ADVISORY_PRODUCT_SEARCH, 'score' => $score, 'signals' => $signals, ]; } return [ 'intent' => self::NONE, 'score' => $score, 'signals' => $signals, ]; } }