Files
MtoRagSystem/src/Knowledge/QueryCleaner.php
2026-02-26 17:43:22 +01:00

80 lines
1.7 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Knowledge;
final class QueryCleaner
{
/**
* Bereinigt eine Query ausschließlich für Retrieval-Zwecke.
*
* Wichtig:
* - Unicode-sicher
* - Zahlen bleiben erhalten
* - Negationen bleiben erhalten
* - Keine aggressive Token-Längen-Filterung
* - StopWords werden entfernt
*/
public function clean(string $query): string
{
if ($query === '') {
return '';
}
// 1. Unicode-sicher lowercase
$query = mb_strtolower($query, 'UTF-8');
// 2. Bindestriche & Slashes als Worttrenner behandeln
$query = str_replace(['-', '/'], ' ', $query);
// 3. Sonderzeichen entfernen, aber:
// - Buchstaben behalten
// - Zahlen behalten
// - Umlaute behalten
$query = preg_replace('/[^\p{L}\p{N}\s]/u', ' ', $query);
if ($query === null) {
return '';
}
// 4. Mehrfache Whitespaces normalisieren
$query = preg_replace('/\s+/u', ' ', $query);
$query = trim($query);
if ($query === '') {
return '';
}
// 5. Tokenisierung
$tokens = preg_split('/\s+/u', $query);
if ($tokens === false) {
return '';
}
$cleanTokens = [];
foreach ($tokens as $token) {
$token = trim($token);
if ($token === '') {
continue;
}
// StopWords entfernen
if (StopWords::isStopWord($token)) {
continue;
}
$cleanTokens[] = $token;
}
if ($cleanTokens === []) {
return '';
}
return implode(' ', $cleanTokens);
}
}