Cet article a été évalué par des pairs par Wern Ancheta. Merci à tous les pairs examinateurs de SitePoint pour avoir obtenu le contenu de SitePoint à son meilleur!
Récemment, il semble que tout le monde parle d'apprentissage automatique. Votre flux de médias sociaux est rempli de messages sur ML, Python, Tensorflow, Spark, Scala, Go, et plus encore;
Oui, qu'en est-il de l'apprentissage automatique et du PHP? Heureusement, quelqu'un était fou non seulement soulever cette question, mais aussi développer une bibliothèque générale d'apprentissage automatique que nous pouvons utiliser dans notre prochain projet. Dans cet article, nous allons jeter un œil à PHP-ML - une bibliothèque d'apprentissage automatique pour PHP - nous rédigerons un cours d'analyse de sentiment qui peut être réutilisé plus tard pour nos propres chatbots ou Twitterbots. Les principaux objectifs de cet article sont les suivants:
Lisez de meilleurs outils et technologies de développement PHP pour faire de vous un meilleur développeur! Lisez ce livre Lire ce livre!
L'apprentissage automatique est un sous-ensemble d'intelligence artificielle qui se concentre sur la «capacité des ordinateurs à apprendre sans programmation explicite». Ceci est réalisé en utilisant un algorithme général qui peut être «appris» à partir d'un ensemble de données spécifique.
Une utilisation courante de l'apprentissage automatique, par exemple, est la classification. Les algorithmes de classification sont utilisés pour diviser les données en différents groupes ou catégories. Quelques exemples d'applications de classification comprennent:
L'apprentissage automatique est un terme général pour les algorithmes généraux couvrant de nombreuses tâches différentes, et elle est principalement divisée en deux types d'algorithmes selon la méthode d'apprentissage - l'apprentissage supervisé et l'apprentissage non supervisé.
Dans l'apprentissage supervisé, nous utilisons des données étiquetées pour former notre algorithme, qui prend le format d'objets d'entrée (vecteurs) et les valeurs de sortie requises; le nouvel ensemble de données non étiqueté.
Pour le reste de ce post, nous nous concentrerons sur l'apprentissage supervisé car il est plus facile de voir et de vérifier les relations; Pour marquer les données.
Ce type d'apprentissage, en revanche, utilise des données non marquées depuis le début. Nous ne connaissons pas la valeur de sortie requise de l'ensemble de données, nous avons donc laissé l'algorithme dessiner des inférences de l'ensemble de données; l'apprentissage non supervisé est particulièrement pratique lors de l'exécution de l'analyse des données exploratoires pour trouver des modèles cachés dans les données.
Connaître PHP-ML, une bibliothèque qui prétend être une nouvelle méthode d'apprentissage automatique PHP. La bibliothèque implémente les algorithmes, les réseaux de neurones et les outils pour le prétraitement des données, la validation croisée et l'extraction de fonctionnalités.
J'avoue d'abord que PHP est un choix inhabituel pour l'apprentissage automatique, car les avantages de la langue ne sont pas très adaptés aux applications d'apprentissage automatique. Autrement dit, toutes les applications d'apprentissage automatique ne doivent pas traiter les données au niveau du PEB et effectuer beaucoup de calculs - pour des applications simples, nous devrions pouvoir utiliser PHP et PHP-ML.
Le meilleur cas d'utilisation pour cette bibliothèque que je peux voir maintenant est la mise en œuvre de classificateurs, qu'il s'agisse de filtres de spam ou d'analyse des sentiments. Nous définirons un problème de classification et créerons une solution étape par étape pour comprendre comment utiliser PHP-ML dans notre projet.
pour donner un exemple du processus de mise en œuvre de PHP-ML et d'ajout d'apprentissage automatique à notre application, je voulais trouver un problème intéressant à résoudre, et quelle meilleure façon de le faire que de construire une classe d'analyse de sentiment Twitter Qu'en est-il Affichage du classificateur?
L'une des exigences clés requises pour créer un projet d'apprentissage automatique réussi est un bon ensemble de données de départ. Les ensembles de données sont cruciaux car ils nous permettront de former notre classificateur contre des exemples classifiés. Avec le récent bruit massif autour des compagnies aériennes, quel meilleur ensemble de données que d'utiliser les tweets des clients aux compagnies aériennes?
Heureusement, grâce à Kaggle.io, nous pouvons déjà utiliser l'ensemble de données Tweet. Vous pouvez utiliser ce lien pour télécharger la base de données Twitter US Airlines Sentiment à partir de leur site Web
Regardons d'abord l'ensemble de données sur lequel nous allons travailler. L'ensemble de données d'origine contient les colonnes suivantes:
et ressemble à l'exemple suivant (une table qui peut être défilée latéralement):
où le texte deviendra notre caractéristique et la compagnie aérienne_sentiment deviendra notre cible. Les colonnes restantes peuvent être jetées car elles ne seront pas utilisées dans nos exercices. Commençons par créer le projet et initialiser le compositeur avec le fichier suivant: Si vous avez besoin d'une introduction de compositeur, voir ici. Pour nous assurer que nous le configurons correctement, créons un script rapide qui chargera notre fichier de données tweets.csv et assurez-vous qu'il a les données dont nous avons besoin. Copiez le code suivant en tant que revueDataset.php dans le répertoire racine du projet: Maintenant, exécutez le script à l'aide de php reviewDataset.php, voyons la sortie: Cela semble inutile maintenant, n'est-ce pas? Jetons un coup d'œil à la classe CSVDataset pour mieux comprendre ce qui se passe à l'intérieur: Le constructeur CSVDataset prend 3 paramètres: Si nous regardons de près, nous pouvons voir que la classe mappait le fichier CSV à deux tableaux internes: échantillons et cibles. Les échantillons contient toutes les caractéristiques fournies par le fichier, tandis que cibles contient des valeurs connues (négatives, positives ou neutres). Sur la base du contenu ci-dessus, nous pouvons voir que le format que notre fichier CSV doit suivre est le suivant: Nous devrons générer un ensemble de données propre qui ne contient que les colonnes dont nous avons besoin pour continuer à travailler. Appelons ce script générationcleandataset.php: Rien n'est trop compliqué, c'est juste assez pour faire le travail. Exécutons-le avec php generatecleandataset.php. Maintenant, soulignons le script ReviewDataset.php à un ensemble de données propre: bam! Ce sont les données que nous pouvons utiliser! Jusqu'à présent, nous avons créé des scripts simples pour manipuler des données. Ensuite, nous commencerons à créer une nouvelle classe sous SRC / Classification / SentimentAnalysis.php. Notre classe d'émotion devra utiliser deux fonctions dans notre classe d'analyse d'émotion: Créez un script nommé classifytweets.php dans le répertoire racine du projet. Nous utiliserons ce script pour instancier et tester notre classe d'analyse des sentiments. Voici le modèle que nous utiliserons: Nous avons déjà du code qui peut être utilisé pour charger CSV dans l'objet de l'ensemble de données dans nos exemples précédents. Nous utiliserons le même code et ferons quelques ajustements: Cela générera un tableau plat contenant uniquement des fonctionnalités (dans ce cas le texte de tweet) que nous utiliserons pour former notre classificateur. Maintenant, avoir le texte d'origine et passer ce texte au classificateur ne sera pas utile ou précis, car chaque tweet est essentiellement différent. Heureusement, il existe des moyens de traiter le texte lorsque vous essayez d'appliquer des algorithmes de classification ou d'apprentissage automatique. Pour cet exemple, nous utiliserons les deux classes suivantes: Commençons par le vectorisateur de texte: Ensuite, appliquez le convertisseur TF-IDF: Notre tableau d'échantillons utilise désormais un format qui peut être facilement compris par notre classificateur. Nous n'avons pas encore terminé, nous devons marquer chaque échantillon avec ses émotions correspondantes. Heureusement, PHP-ML couvre déjà cette exigence, et le code est très simple: Nous pouvons continuer à utiliser cet ensemble de données et à former notre classificateur. Cependant, nous n'avons pas l'ensemble de données de test utilisé comme validation, nous "tricher" un peu et diviser notre ensemble de données d'origine en deux parties: un ensemble de données de formation et des données beaucoup plus petites pour tester l'ensemble de précision du modèle. Cette méthode est appelée validation croisée. Ce terme provient des statistiques et peut être défini comme suit: La validation croisée, parfois appelée estimation de rotation, est une technique de vérification du modèle utilisé pour évaluer comment les résultats de l'analyse statistique se généraliseront aux ensembles de données indépendants. Il est principalement utilisé pour la définition d'objectifs des prédictions et souhaite estimer la précision du modèle de prédiction dans la pratique. - wikipedia.com Enfin, nous sommes prêts à retourner et à mettre en œuvre la classe de sentiment d'analyse. Si vous ne l'avez pas encore remarqué, une grande partie de l'apprentissage automatique consiste à collecter et à manipuler des données; les implémentations réelles des modèles d'apprentissage automatique impliquent souvent moins de contenu. Pour mettre en œuvre notre classe d'analyse des sentiments, nous avons trois algorithmes de classification disponibles: Pour cet exercice, nous utiliserons le plus simple, le classificateur naïf de Bayes, alors continuons à mettre à jour notre classe pour implémenter la méthode du train: Comme vous pouvez le voir, nous laissons PHP-ML faire tout le travail lourd pour nous. Nous venons de créer une belle abstraction pour notre projet. Mais comment savons-nous si nos classificateurs s'entraînent et fonctionnent vraiment? Il est temps d'utiliser nos tests d'échantillons et de test de test. Nous devons implémenter la méthode de prédiction avant de continuer à tester notre classificateur: De même, PHP-ML nous a aidés et a fait tout le levage de lourds pour nous. Mettons à jour la classe ClassifyTweets en conséquence: Enfin, nous avons besoin d'un moyen de tester la précision de notre modèle de formation; Heureusement, PHP-ML le couvre également, et ils ont plusieurs classes métriques. Dans notre cas, nous sommes intéressés par l'exactitude du modèle. Regardons le code: Nous devrions voir quelque chose de similaire à ce qui suit: Ce message est un peu long, alors passons en revue ce que nous avons appris jusqu'à présent: Cet article sert également d'introduction à la bibliothèque PHP-ML et espère vous donner une bonne compréhension des fonctionnalités de la bibliothèque et comment l'intégrer dans vos propres projets. Enfin, cet article n'est nullement complet, et il y a encore beaucoup de choses à apprendre, à améliorer et à expérimenter;
Le dépannage de l'ironie et des antonymes dans l'analyse des sentiments est une tâche difficile. Ces caractéristiques linguistiques impliquent souvent de dire quelque chose, mais signifiant le contraire, ce qui est difficile à comprendre pour les modèles d'apprentissage automatique. Une approche consiste à utiliser des modèles plus complexes qui peuvent comprendre le contexte, tels que des modèles d'apprentissage en profondeur. Une autre approche consiste à utiliser un modèle de détection satirique spécialisé qui peut être formé à l'aide d'un ensemble de données de commentaires satiriques. Les principes de l'analyse des sentiments peuvent être appliqués à toutes les données texte, y compris les publications d'autres plateformes de médias sociaux. La principale différence est la façon dont vous collectez des données. Chaque plateforme de médias sociaux a sa propre API pour accéder aux publications d'utilisateurs, vous devez donc être familiarisé avec l'API de la plate-forme qui vous intéresse. Oui, l'analyse des sentiments peut être utilisée dans n'importe quelle langue. Cependant, l'efficacité de l'analyse dépendra de la qualité de vos données de formation. Si vous utilisez une langue autre que l'anglais, vous devez utiliser l'ensemble de données de cette langue pour former votre modèle. Certaines bibliothèques d'apprentissage automatique prennent également en charge directement plusieurs langues. Il existe de nombreuses façons de visualiser les résultats de l'analyse des sentiments. Une approche commune consiste à utiliser des graphiques à barres pour montrer le nombre de tweets positifs, négatifs et neutres. Une autre approche consiste à utiliser Word Cloud pour visualiser les mots les plus couramment utilisés dans les données. PHP a plusieurs bibliothèques pour créer ces visualisations, telles que Pchart et GD. L'analyse émotionnelle a de nombreuses applications pratiques. Les entreprises peuvent l'utiliser pour surveiller les opinions des clients sur leurs produits ou services, les politiciens peuvent l'utiliser pour mesurer les opinions du public sur les questions politiques, et les chercheurs peuvent l'utiliser pour étudier les tendances sociales. Les possibilités sont infinies. Les emojis peuvent transporter des informations émotionnelles importantes, il est donc important de les inclure dans votre analyse. Une façon consiste à remplacer chaque emoji par sa description de texte avant d'entrer les données dans le modèle. Il existe des bibliothèques qui peuvent vous aider à le faire, comme Emojione de PHP. Les erreurs de dépensation peuvent être un défi dans l'analyse des sentiments. Une façon consiste à utiliser un vérificateur orthographique pour corriger l'erreur avant d'entrer les données dans le modèle. Une autre approche consiste à utiliser des modèles qui peuvent gérer les erreurs d'orthographe, telles que les modèles d'apprentissage en profondeur. Garder votre modèle d'analyse de sentiment à jour implique de le recycler régulièrement à l'aide de nouvelles données. Cela garantit que votre modèle est synchronisé avec l'utilisation du langage et les changements émotionnels. Vous pouvez automatiser ce processus en configurant un plan pour recycler le modèle. tweet_id Airline_Sentiment Airline_Sentiment_confidence négativerreason négativerreason_confidence négativerreason_confidence airline Airline_Sentiment_gold name négativeraison_gold retweet_count text tweet_coord tweet_creat ed 🎜> tweet_location user_timezone 57030613367760513 Neutral 1.0 Virgin America Cairdin 0 @virginamerica What @dhepburn a dit. (États-Unis et Canada) 570301130888122368 Positif 0,3486 0,0 Virgin America Jnardino 0 @Virginamerica Plus vous avez ajouté des publicités à l'expérience… Tacky. America Yvonnalynn 0 @virginamerica Je n'ai pas fait aujourd'hui… je dois signifier que j'ai besoin de faire un autre voyage! Jnardino 0 "@virginamerica Il est vraiment agressif de faire exploser" "divertissement" "les visages de vos invités et ils ont peu de recours" 2015-02-24 11:15:36 -0800 P ACIFIC Time (US & Canada) 570300817074462722 négatif 1.0 Je ne peux pas dire 1.0 Virgin America Jnardino 0 @virginamerica et c'est une très grande mauvaise chose à ce sujet 2015-02-24 11:14:45 -0800 Pacific Time (US & Canada) 570300767074181121 négatif 1.0 Can't Tell 0.6842 Virgin America Jnardino 0 «@Virginamerica paierait sérieusement 30 $ le vol pour des sièges qui n'avaient pas ce jeu. Positif 0,6745 0,0 Virgin America Cjmcginnis 0 «@virginamerica Oui, presque chaque fois que je pilote vx ce« ver »ne disparaîtra pas :)» 2015-02-24 11:13:57 -0800 San Francisco Ca Pacific Time (US & Canada) 570300248553349120 Neutre 0,634 Virgin America Pilot 0 «@Virginamerica a vraiment raté une opportunité principale pour les hommes sans chapeaux là-bas. 11:12:29 -0800 Los Angeles Pacific Time (US & Canada) Ce fichier contient 14 640 tweets, il s'agit donc d'un bon ensemble de données de travail pour nous. Maintenant, avec le nombre de colonnes que nous avons actuellement, nous avons plus de données que les exemples nécessaires;
<code>{
"name": "amacgregor/phpml-exercise",
"description": "Example implementation of a Tweet sentiment analysis with PHP-ML",
"type": "project",
"require": {
"php-ai/php-ml": "^0.4.1"
},
"license": "Apache License 2.0",
"authors": [
{
"name": "Allan MacGregor",
"email": "amacgregor@allanmacgregor.com"
}
],
"autoload": {
"psr-4": {"PhpmlExercise\": "src/"}
},
"minimum-stability": "dev"
}</code>
<code>composer install
</code>
<?php namespace PhpmlExercise;
require __DIR__ . '/vendor/autoload.php';
use Phpml\Dataset\CsvDataset;
$dataset = new CsvDataset('datasets/raw/Tweets.csv',1);
foreach ($dataset->getSamples() as $sample) {
print_r($sample);
}
<code>Array( [0] => 569587371693355008 )
Array( [0] => 569587242672398336 )
Array( [0] => 569587188687634433 )
Array( [0] => 569587140490866689 )
</code>
<?php
public function __construct(string $filepath, int $features, bool $headingRow = true)
{
if (!file_exists($filepath)) {
throw FileException::missingFile(basename($filepath));
}
if (false === $handle = fopen($filepath, 'rb')) {
throw FileException::cantOpenFile(basename($filepath));
}
if ($headingRow) {
$data = fgetcsv($handle, 1000, ',');
$this->columnNames = array_slice($data, 0, $features);
} else {
$this->columnNames = range(0, $features - 1);
}
while (($data = fgetcsv($handle, 1000, ',')) !== false) {
$this->samples[] = array_slice($data, 0, $features);
$this->targets[] = $data[$features];
}
fclose($handle);
}
<code>| feature_1 | feature_2 | feature_n | target | </code>
<?php namespace PhpmlExercise;
require __DIR__ . '/vendor/autoload.php';
use Phpml\Exception\FileException;
$sourceFilepath = __DIR__ . '/datasets/raw/Tweets.csv';
$destinationFilepath = __DIR__ . '/datasets/clean_tweets.csv';
$rows =[];
$rows = getRows($sourceFilepath, $rows);
writeRows($destinationFilepath, $rows);
/**
* @param $filepath
* @param $rows
* @return array
*/
function getRows($filepath, $rows)
{
$handle = checkFilePermissions($filepath);
while (($data = fgetcsv($handle, 1000, ',')) !== false) {
$rows[] = [$data[10], $data[1]];
}
fclose($handle);
return $rows;
}
/**
* @param $filepath
* @param string $mode
* @return bool|resource
* @throws FileException
*/
function checkFilePermissions($filepath, $mode = 'rb')
{
if (!file_exists($filepath)) {
throw FileException::missingFile(basename($filepath));
}
if (false === $handle = fopen($filepath, $mode)) {
throw FileException::cantOpenFile(basename($filepath));
}
return $handle;
}
/**
* @param $filepath
* @param $rows
* @internal param $list
*/
function writeRows($filepath, $rows)
{
$handle = checkFilePermissions($filepath, 'wb');
foreach ($rows as $row) {
fputcsv($handle, $row);
}
fclose($handle);
}
<code>Array
(
[0] => @AmericanAir That will be the third time I have been called by 800-433-7300 an hung on before anyone speaks. What do I do now???
)
Array
(
[0] => @AmericanAir How clueless is AA. Been waiting to hear for 2.5 weeks about a refund from a Cancelled Flightled flight & been on hold now for 1hr 49min
)</code>
<?php namespace PhpmlExercise\Classification;
/**
* Class SentimentAnalysis
* @package PhpmlExercise\Classification
*/
class SentimentAnalysis {
public function train() {}
public function predict() {}
}
<?php
namespace PhpmlExercise;
use PhpmlExercise\Classification\SentimentAnalysis;
require __DIR__ . '/vendor/autoload.php';
// 步骤 1:加载数据集
// 步骤 2:准备数据集
// 步骤 3:生成训练/测试数据集
// 步骤 4:训练分类器
// 步骤 5:测试分类器的准确性
Étape 1: Chargez l'ensemble de données
<?php ...
use Phpml\Dataset\CsvDataset;
...
$dataset = new CsvDataset('datasets/clean_tweets.csv',1);
$samples = [];
foreach ($dataset->getSamples() as $sample) {
$samples[] = $sample[0];
}
Étape 2: Préparez l'ensemble de données
<code>{
"name": "amacgregor/phpml-exercise",
"description": "Example implementation of a Tweet sentiment analysis with PHP-ML",
"type": "project",
"require": {
"php-ai/php-ml": "^0.4.1"
},
"license": "Apache License 2.0",
"authors": [
{
"name": "Allan MacGregor",
"email": "amacgregor@allanmacgregor.com"
}
],
"autoload": {
"psr-4": {"PhpmlExercise\": "src/"}
},
"minimum-stability": "dev"
}</code>
<code>composer install
</code>
Étape 3: Générez l'ensemble de données de formation
<?php namespace PhpmlExercise;
require __DIR__ . '/vendor/autoload.php';
use Phpml\Dataset\CsvDataset;
$dataset = new CsvDataset('datasets/raw/Tweets.csv',1);
foreach ($dataset->getSamples() as $sample) {
print_r($sample);
}
<code>Array( [0] => 569587371693355008 )
Array( [0] => 569587242672398336 )
Array( [0] => 569587188687634433 )
Array( [0] => 569587140490866689 )
</code>
Étape 4: Formation du classificateur
<?php
public function __construct(string $filepath, int $features, bool $headingRow = true)
{
if (!file_exists($filepath)) {
throw FileException::missingFile(basename($filepath));
}
if (false === $handle = fopen($filepath, 'rb')) {
throw FileException::cantOpenFile(basename($filepath));
}
if ($headingRow) {
$data = fgetcsv($handle, 1000, ',');
$this->columnNames = array_slice($data, 0, $features);
} else {
$this->columnNames = range(0, $features - 1);
}
while (($data = fgetcsv($handle, 1000, ',')) !== false) {
$this->samples[] = array_slice($data, 0, $features);
$this->targets[] = $data[$features];
}
fclose($handle);
}
Étape 5: Testez la précision du classificateur
<code>{
"name": "amacgregor/phpml-exercise",
"description": "Example implementation of a Tweet sentiment analysis with PHP-ML",
"type": "project",
"require": {
"php-ai/php-ml": "^0.4.1"
},
"license": "Apache License 2.0",
"authors": [
{
"name": "Allan MacGregor",
"email": "amacgregor@allanmacgregor.com"
}
],
"autoload": {
"psr-4": {"PhpmlExercise\": "src/"}
},
"minimum-stability": "dev"
}</code>
<code>composer install
</code>
<?php namespace PhpmlExercise;
require __DIR__ . '/vendor/autoload.php';
use Phpml\Dataset\CsvDataset;
$dataset = new CsvDataset('datasets/raw/Tweets.csv',1);
foreach ($dataset->getSamples() as $sample) {
print_r($sample);
}
<code>Array( [0] => 569587371693355008 )
Array( [0] => 569587242672398336 )
Array( [0] => 569587188687634433 )
Array( [0] => 569587140490866689 )
</code>
Conclusion
Remplacez l'algorithme naïf de Bayes par l'algorithme de la machine de vecteur de support.
J'espère que vous trouverez cet article utile. Si vous avez des idées d'application ou des questions sur PHP-ML, n'hésitez pas à les mentionner dans la section des commentaires ci-dessous!
Comment améliorer la précision de l'analyse des sentiments?
Améliorer la précision de l'analyse des sentiments implique une variété de stratégies. Tout d'abord, assurez-vous que vos données de formation sont aussi propres et pertinentes que possible. Cela signifie supprimer des données non liées telles que les mots d'arrêt, les marques de ponctuation et les URL. Deuxièmement, envisagez d'utiliser des algorithmes plus complexes. Bien que les classificateurs naïfs de Bayes soient un excellent point de départ, d'autres algorithmes tels que les machines de vecteur de support (SVM) ou les modèles d'apprentissage en profondeur peuvent fournir de meilleurs résultats. Enfin, envisagez d'utiliser un ensemble de données plus large pour la formation. Plus vos données peuvent apprendre de données, plus elle sera précise.
Oui, vous pouvez utiliser d'autres langages de programmation pour l'analyse des sentiments. Python, par exemple, est devenu un choix populaire pour sa vaste bibliothèque d'apprentissage automatique comme NLTK, TextBlob et Scikit-Learn. Cependant, PHP peut également être utilisé efficacement pour l'analyse des sentiments, surtout si vous connaissez déjà la langue ou si votre projet est construit sur le cadre PHP.
Comment gérer l'ironie et les antonymes dans l'analyse émotionnelle?
Comment utiliser l'analyse des sentiments pour d'autres plateformes de médias sociaux?
Puis-je utiliser l'analyse des sentiments pour les langues autres que l'anglais?
Comment visualiser les résultats de l'analyse des sentiments?
Comment utiliser l'analyse des sentiments dans les applications pratiques?
Comment gérer les emojis dans l'analyse des sentiments?
Comment faire face aux erreurs d'orthographe dans l'analyse des sentiments?
Comment maintenir mon modèle d'analyse des sentiments à jour?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!