49 lines
1.2 KiB
PHP
49 lines
1.2 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
declare(strict_types=1);
|
||
|
|
|
||
|
|
namespace Classifier\Lib\Model;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Gère l'apprentissage du modèle à partir des données sources.
|
||
|
|
*/
|
||
|
|
class ModelTrainer
|
||
|
|
{
|
||
|
|
/** @var MessageQualifier */
|
||
|
|
private $qualifier;
|
||
|
|
|
||
|
|
public function __construct(MessageQualifier $qualifier)
|
||
|
|
{
|
||
|
|
$this->qualifier = $qualifier;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Entraîne le modèle à partir d'un tableau associatif [Label => [Messages]]
|
||
|
|
*
|
||
|
|
* @param array<string,string[]> $data
|
||
|
|
* @throws \Exception
|
||
|
|
*/
|
||
|
|
public function trainFromData(array $data): void
|
||
|
|
{
|
||
|
|
$samples = [];
|
||
|
|
$labels = [];
|
||
|
|
|
||
|
|
foreach ($data as $category => $messages) {
|
||
|
|
foreach ($messages as $msg) {
|
||
|
|
$cleanedMsg = trim($msg);
|
||
|
|
if (!empty($cleanedMsg)) {
|
||
|
|
// NOTE: Rubix attend un tableau de caractéristiques (une seule colonne pour le texte)
|
||
|
|
$samples[] = [$cleanedMsg];
|
||
|
|
$labels[] = $category;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (empty($samples)) {
|
||
|
|
throw new \Exception("Erreur : Aucun échantillon valide trouvé pour l'entraînement.");
|
||
|
|
}
|
||
|
|
|
||
|
|
$this->qualifier->train($samples, $labels);
|
||
|
|
}
|
||
|
|
}
|