add shopware store-api
This commit is contained in:
120
src/Intent/CommerceIntentLite.php
Normal file
120
src/Intent/CommerceIntentLite.php
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Intent;
|
||||
|
||||
final class CommerceIntentLite
|
||||
{
|
||||
public const NONE = 'none';
|
||||
public const PRODUCT_SEARCH = 'product_search';
|
||||
public const ADVISORY_PRODUCT_SEARCH = 'advisory_product_search';
|
||||
|
||||
/**
|
||||
* @return array{intent:string, score:int, signals:string[]}
|
||||
*/
|
||||
public function detect(string $originalPrompt): array
|
||||
{
|
||||
$p = mb_strtolower(trim($originalPrompt));
|
||||
|
||||
if ($p === '') {
|
||||
return [
|
||||
'intent' => self::NONE,
|
||||
'score' => 0,
|
||||
'signals' => [],
|
||||
];
|
||||
}
|
||||
|
||||
$score = 0;
|
||||
$signals = [];
|
||||
|
||||
$strongSignals = [
|
||||
'suche',
|
||||
'habt',
|
||||
'gibt',
|
||||
'zeig',
|
||||
'welche',
|
||||
'vergleich',
|
||||
'alternativ',
|
||||
'find',
|
||||
'shop',
|
||||
'sku',
|
||||
'Artikel',
|
||||
'Gerät'
|
||||
];
|
||||
|
||||
foreach ($strongSignals as $signal) {
|
||||
if (str_contains($p, $signal)) {
|
||||
$score += 2;
|
||||
$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,
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user