cii-text-analysis/save/ml.php.save

101 lines
3.1 KiB
Text
Raw Permalink Normal View History

2026-02-10 16:19:59 +01:00
<?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"