optimize py autoload
This commit is contained in:
@@ -4,17 +4,41 @@ declare(strict_types=1);
|
||||
|
||||
namespace App\Knowledge;
|
||||
|
||||
final readonly class QueryCleaner
|
||||
final class QueryCleaner
|
||||
{
|
||||
public function __construct(
|
||||
private StopWords $stopWords
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
{
|
||||
$query = mb_strtolower($query);
|
||||
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);
|
||||
|
||||
@@ -22,18 +46,35 @@ final readonly class QueryCleaner
|
||||
return '';
|
||||
}
|
||||
|
||||
$tokens = explode(' ', $query);
|
||||
$stopWords = $this->stopWords->getStopWords(); // <-- wichtig: nutzt deine Klasse
|
||||
// 5. Tokenisierung
|
||||
$tokens = preg_split('/\s+/u', $query);
|
||||
|
||||
$filtered = array_filter(
|
||||
$tokens,
|
||||
function (string $word) use ($stopWords): bool {
|
||||
return $word !== ''
|
||||
&& mb_strlen($word) > 2
|
||||
&& !in_array($word, $stopWords, true);
|
||||
if ($tokens === false) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$cleanTokens = [];
|
||||
|
||||
foreach ($tokens as $token) {
|
||||
|
||||
$token = trim($token);
|
||||
|
||||
if ($token === '') {
|
||||
continue;
|
||||
}
|
||||
);
|
||||
|
||||
return implode(' ', $filtered);
|
||||
// StopWords entfernen
|
||||
if (StopWords::isStopWord($token)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$cleanTokens[] = $token;
|
||||
}
|
||||
|
||||
if ($cleanTokens === []) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return implode(' ', $cleanTokens);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user