normalize($originalPrompt); $score = 0; $signals = []; // -------------------------------------------------------- // 1. Starke explizite Listen-Trigger (hohes Gewicht) // -------------------------------------------------------- $strongPatterns = $this->config->getStrongPatterns(); foreach ($strongPatterns as $pattern) { if (preg_match($pattern, $p) === 1) { $score += 3; $signals[] = "strong:$pattern"; } } // -------------------------------------------------------- // 2. Mengen- / Mehrzahl-Indikatoren // -------------------------------------------------------- $quantityWords = $this->config->getQuantityWords(); foreach ($quantityWords as $word) { if (preg_match('/\b' . preg_quote($word, '/') . '\b/u', $p) === 1) { $score += 2; $signals[] = "quantity:$word"; } } // -------------------------------------------------------- // 3. Explizite Zahlen (z. B. "5 Vorteile") // -------------------------------------------------------- if (preg_match('/\b\d+\b/u', $p) === 1) { $score += 2; $signals[] = 'number'; } // -------------------------------------------------------- // 4. Enumeration-Hinweise (1., -, *, etc.) // -------------------------------------------------------- if ( preg_match('/(^|\s)(\d+\)|\d+\.|-\s|\*\s)/u', $originalPrompt) === 1 ) { $score += 1; $signals[] = 'enumeration_hint'; } // -------------------------------------------------------- // Entscheidung // -------------------------------------------------------- $isList = $score >= $this->config->getListThreshold(); return [ 'is_list' => $isList, 'score' => $score, 'signals' => $signals, ]; } public function isListQuery(string $originalPrompt): bool { return $this->detectList($originalPrompt)['is_list']; } // ------------------------------------------------------------ // Interne Normalisierung (ohne Stopword-Entfernung!) // ------------------------------------------------------------ private function normalize(string $s): string { $s = mb_strtolower($s); // Keep the language-specific transliteration table in YAML. // Only append an ASCII variant; do not replace the original form. foreach ($this->languageCleanupConfig->getAsciiTransliterationMap() as $umlaut => $alt) { if (str_contains($s, $umlaut)) { $s .= ' ' . str_replace($umlaut, $alt, $s); break; } } return $s; } }