100 lines
3.1 KiB
Text
100 lines
3.1 KiB
Text
<?php
|
|
|
|
require __DIR__ . '/vendor/autoload.php';
|
|
|
|
use Phpml\Classification\SVC;
|
|
use Phpml\FeatureExtraction\TfIdfTransformer;
|
|
use Phpml\FeatureExtraction\TokenCountVectorizer;
|
|
use Phpml\Tokenization\WhitespaceTokenizer;
|
|
use Phpml\SupportVectorMachine\Kernel;
|
|
use Phpml\ModelManager;
|
|
|
|
require __DIR__ . '/TokenIzer.php';
|
|
|
|
// 1. Vos données d'entraînement
|
|
// $samples = [
|
|
// 'Je suis très heureux',
|
|
// 'C\'est fantastique',
|
|
// 'Je suis triste',
|
|
// 'C\'est horrible'
|
|
// ];
|
|
// $labels = ['positif', 'positif', 'négatif', 'négatif'];
|
|
|
|
// $messageTest = <<<'EOT'
|
|
// Bonjour, je vends mon iPhone 12 Pro Max 256 Go en excellent état, avec tous les accessoires d'origine. Prix : 900€. Contactez-moi pour plus d'informations.
|
|
// EOT;
|
|
$messageTest = <<<'EOT'
|
|
Alerte : un incendie s'est déclaré dans un immeuble du centre-ville. Les pompiers sont sur place et maîtrisent la situation. Aucune victime n'est à déplorer pour le moment, mais les autorités recommandent d'éviter le secteur. Nous vous tiendrons informés de l'évolution de la situation.
|
|
EOT;
|
|
|
|
$samples = [];
|
|
$labels = [];
|
|
|
|
$files = [
|
|
__DIR__ . '/output/positive.php',
|
|
__DIR__ . '/output/negative.php',
|
|
];
|
|
|
|
foreach ($files as $file) {
|
|
$texts = require $file;
|
|
foreach ($texts as $text) {
|
|
$samples[] = $text;
|
|
$labels[] = basename($file, '.php');
|
|
}
|
|
}
|
|
|
|
// 2. Transformer le texte en vecteurs (nombres) compréhensibles par la machine
|
|
$vectorizer = new TokenCountVectorizer(new WhitespaceLowerTokenizer());
|
|
$vectorizer->fit($samples);
|
|
$vectorizer->transform($samples);
|
|
|
|
// 3. Entraîner le classifier
|
|
$classifier = new SVC(Kernel::SIGMOID, 10000);
|
|
$classifier->train($samples, $labels);
|
|
|
|
// 4. Prédire
|
|
$newSample = [$messageTest];
|
|
$vectorizer->transform($newSample);
|
|
echo $classifier->predict($newSample)[0]; // Affiche "négatif"
|
|
|
|
// 5. Sauvegarder le modèle
|
|
$filepath = __DIR__ . '/model.phpml';
|
|
$modelManager = new ModelManager();
|
|
$modelManager->saveToFile($classifier, $filepath);
|
|
|
|
// 6. Charger le modèle
|
|
$restoredClassifier = $modelManager->restoreFromFile($filepath);
|
|
echo "\n" . 'Prédiction avec le modèle chargé : ' . $restoredClassifier->predict($newSample)[0] . "\n";
|
|
|
|
/// --- TEST ---
|
|
|
|
$samples = [];
|
|
$labels = [];
|
|
|
|
foreach ($files as $file) {
|
|
$texts = require $file;
|
|
foreach ($texts as $text) {
|
|
$samples[] = $text;
|
|
$labels[] = basename($file, '.php');
|
|
}
|
|
}
|
|
|
|
// --- Étape A : Vectorisation (Comptage) ---
|
|
$vectorizer = new TokenCountVectorizer(new WhitespaceLowerTokenizer());
|
|
$vectorizer->fit($samples);
|
|
$vectorizer->transform($samples);
|
|
|
|
// --- Étape B : Transformation TF-IDF ---
|
|
$transformer = new TfIdfTransformer();
|
|
$transformer->fit($samples); // Calcule l'importance des mots sur tout le corpus
|
|
$transformer->transform($samples); // Applique le calcul aux échantillons
|
|
|
|
// --- Étape C : Entraînement ---
|
|
$classifier = new SVC(Kernel::RBF, 10000);
|
|
$classifier->train($samples, $labels);
|
|
|
|
// --- Étape D : Prédiction ---
|
|
$newSample = [$messageTest];
|
|
$vectorizer->transform($newSample);
|
|
$transformer->transform($newSample);
|
|
echo $classifier->predict($newSample)[0]; // Affiche "positif"
|