80 lines
1.7 KiB
PHP
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);
|
|
}
|
|
} |