Dieser Artikel wurde von Wern Ancheta überprüft. Vielen Dank an alle Peer -Rezensenten bei SitePoint für die Erhöhung der Inhalte von SitePoint -Inhalten!
In letzter Zeit scheint jeder über maschinelles Lernen zu sprechen. Ihr Social -Media -Stream ist mit Posts über ML, Python, Tensorflow, Spark, Scala, Go und mehr gefüllt.
Ja, was ist mit maschinellem Lernen und PHP? Glücklicherweise war jemand verrückt, diese Frage nicht nur zu stellen, sondern auch eine allgemeine Bibliothek für maschinelles Lernen zu entwickeln, die wir in unserem nächsten Projekt verwenden können. In diesem Beitrag werden wir einen Blick auf PHP-ML-eine maschinelle Lernbibliothek für PHP-werfen, werden wir eine Sentiment-Analyse-Klasse schreiben, die später für unsere eigenen Chatbots oder Twitterbots wiederverwendet werden kann. Die Hauptziele dieses Artikels sind:
Lesen Sie dieses Buch lesen Sie dieses Buch!
Eine gemeinsame Verwendung von maschinellem Lernen ist beispielsweise die Klassifizierung. Klassifizierungsalgorithmen werden verwendet, um Daten in verschiedene Gruppen oder Kategorien zu unterteilen. Einige Beispiele für Klassifizierungsanwendungen umfassen:
maschinelles Lernen ist ein allgemeiner Begriff für allgemeine Algorithmen, die viele verschiedene Aufgaben abdecken, und ist hauptsächlich in zwei Arten von Algorithmen unterteilt, je nach Lernmethode - überwachtes Lernen und unbeaufsichtigtes Lernen.
Im überwachten Lernen verwenden wir beschriftete Daten, um unseren Algorithmus zu trainieren, der das Format von Eingabefiele (Vektoren) annimmt, und die erforderlichen Ausgabewerte analysiert. der neue nicht markierte Datensatz.
Für den Rest dieses Beitrags werden wir uns auf das überwachte Lernen konzentrieren, weil es einfacher ist, Beziehungen zu erkennen und zu überprüfen. Daten markieren.
Diese Art des Lernens verwendet andererseits von Anfang an unbezeichnete Daten. Wir kennen den erforderlichen Ausgangswert des Datensatzes nicht, sodass der Algorithmus Schlussfolgerungen aus dem Datensatz ziehen kann.
Kennen Sie PHP-ML, eine Bibliothek, die behauptet, eine neue Methode des maschinellen Lernens von PHP zu sein. Die Bibliothek implementiert Algorithmen, neuronale Netzwerke und Tools zur Datenvorverarbeitung, Kreuzvalidierung und Merkmalextraktion.
Ich gebe zuerst zu, dass PHP eine ungewöhnliche Wahl für maschinelles Lernen ist, da die Vorteile der Sprache für Anwendungen für maschinelles Lernen nicht sehr geeignet sind. Das heißt, nicht jede Anwendung für maschinelles Lernen muss Daten auf PEB-Ebene verarbeiten und viele Berechnungen durchführen-für einfache Anwendungen sollten wir in der Lage sein, PHP und PHP-ML zu verwenden.
Der beste Anwendungsfall für diese Bibliothek, das ich jetzt sehen kann, ist die Implementierung von Klassifikatoren, unabhängig davon, ob es sich um Spam -Filter oder Stimmungsanalyse handelt. Wir werden ein Klassifizierungsproblem definieren und Schritt für Schritt eine Lösung erstellen, um zu verstehen, wie PHP-ML in unserem Projekt verwendet wird.
Um ein Beispiel für den Prozess der Implementierung von PHP-ML und dem Hinzufügen von maschinellem Lernen zu unserer Anwendung zu geben, wollte ich ein interessantes Problem finden, und was gibt es Schöneres, als dies zu tun, als eine Twitter-Sentiment-Analyse-Klasse zu erstellen. Was ist mit Zeigen Sie den Klassifikator?
Eine der wichtigsten Anforderungen, die zum Erstellen eines erfolgreichen Projekts für maschinelles Lernen erforderlich sind, ist ein guter Startdatensatz. Datensätze sind von entscheidender Bedeutung, da sie es uns ermöglichen, unseren Klassifikator an klassifizierten Beispielen auszubilden. Welchen besseren Datensatz mit den jüngsten massiven Geräuschen um Fluggesellschaften gibt es besser, als Kunden -Tweets für Fluggesellschaften zu verwenden?
Zum Glück können wir dank Kaggle.io den Tweet -Datensatz bereits verwenden. Sie können diesen Link verwenden, um Twitter US Airlines Sentiment -Datenbank von ihrer Website
herunterzuladenSchauen wir uns zunächst den Datensatz an, an dem wir arbeiten werden. Der ursprüngliche Datensatz enthält die folgenden Spalten:
und sieht aus wie das folgende Beispiel (eine Tabelle, die seitwärts scrolliert werden kann):
tweet_id
airline_sentiment
airline_sentiment_confidence
negativereason
negativereason_confidence negativereason_confidenceairline airline_sentiment_gold Name negativerseason_gold retweet_count text tweet_coord tweet_creat ed tweet_location user_timezone 570306133677760513 Neutral 1.0 Virgin America Cairdin 0 @virginamerica Was @Dhepburn sagte. (US & Canada) 570301130888122368 Positiv 0,3486 0.0 Virgin America Jnardino 0 @virginamerica plus Sie haben Werbespots für die Erfahrung hinzugefügt… klebrig. Amerika YVonnalynn 0 @virginamerica Ich muss heute nicht bedeuten, dass ich eine weitere Reise machen muss! Jnardino 0 "@virginamerica Es ist wirklich aggressiv, widerwärtige" "Unterhaltung" in den Gesichtern Ihrer Gäste zu sprengen und sie haben wenig Rückgriff "2015-02-24 11:15:36 -0800 P ACIFIC TIME (US & CANADA) 570300817074462722 Negativ 1.0 Ich kann 1.0 Virgin America Jnardino 0 @virginamerica erzählen und es ist eine wirklich große schlechte Sache, 2015-02-24 11:14:45 -0800 Pacific Time (US & Canada) 570300767074181121 Negativ 1.0 NICHT 0,6842 VIRGIN America Jnardino zu sagen 0 “@virginamerica würde ernsthaft 30 US-Dollar für Sitze zahlen, die dieses Spiel nicht hatten. Positiv 0,6745 0.0 Virgin America cjmcGinnis 0 “@virginamerica Ja Fast jedes Mal, wenn ich vx fliege, wird dieser„ Ohrwurm “nicht verschwinden :)” 2015-02-24 11:13:57 -0800 San Francisco Ca Pacific Time (US & U & Kanada) 570300248553349120 Neutral 0,634 Virgin America Pilot 0 “@virginamerica hat dort eine Hauptmöglichkeit für Männer ohne Hüte verpasst 11:12:29 -0800 Los Angeles Pacific Time (US & Canada) Diese Datei enthält 14.640 Tweets, daher ist sie ein gutes Arbeitsdatensatz für uns. Mit der Anzahl der Spalten, die wir derzeit haben, haben wir mehr Daten als die Beispiele für praktische Zwecke.
Wo Text zu unserem Merkmal und unserer Fluggesellschaft wird, wird unser Ziel. Die verbleibenden Spalten können verworfen werden, da sie in unseren Übungen nicht verwendet werden. Beginnen wir mit der Erstellung des Projekts und initialisieren Sie den Komponisten mit der folgenden Datei:
<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>
Wenn Sie eine Einführung in Komponisten benötigen, siehe hier.
Um sicherzustellen, dass wir es korrekt einrichten, erstellen wir ein schnelles Skript, mit dem unsere Datendatei tweets.csv geladen wird, und stellen Sie sicher, dass sie über die benötigten Daten verfügen. Kopieren Sie den folgenden Code als ReviewDataset.php im Projektroot -Verzeichnis:
<?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); }
Führen Sie nun das Skript mit PHP ReviewDataset.php aus. Sehen wir uns die Ausgabe an:
<code>Array( [0] => 569587371693355008 ) Array( [0] => 569587242672398336 ) Array( [0] => 569587188687634433 ) Array( [0] => 569587140490866689 ) </code>
Das sieht jetzt nutzlos aus, nicht wahr? Schauen wir uns die CSVDataset -Klasse an, um besser zu verstehen, was im Inneren passiert:
<?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); }
csvdataset Constructor nimmt 3 Parameter:
Wenn wir genau hinschauen, können wir sehen, dass die Klasse die CSV -Datei auf zwei interne Arrays abbildt: Samples und Ziele. Beispiele enthält alle von der Datei bereitgestellten Eigenschaften, während Ziele bekannte Werte (negativ, positiv oder neutral) enthält.
Basierend auf dem obigen Inhalt können wir sehen, dass das Format, das unsere CSV -Datei folgen muss, wie folgt lautet:
<code>| feature_1 | feature_2 | feature_n | target | </code>
Wir müssen einen sauberen Datensatz generieren, der nur die Spalten enthält, die wir benötigen, um weiter zu arbeiten. Nennen wir dieses Skript generateCleandataset.php:
<?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); }
Nichts ist zu kompliziert, es ist gerade genug, um den Job zu erledigen. Lassen Sie es uns mit PHP GenerateCleandaSet.php ausführen.
Zeigen wir nun das Skript reviewDataset.php auf einen sauberen Datensatz:
<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>
BAM! Dies sind die Daten, die wir verwenden können! Bisher haben wir einfache Skripte zum Manipulieren von Daten erstellt. Als nächstes werden wir anfangen, eine neue Klasse unter SRC/Klassifizierung/sentimentanalysis.php zu erstellen.
<?php namespace PhpmlExercise\Classification; /** * Class SentimentAnalysis * @package PhpmlExercise\Classification */ class SentimentAnalysis { public function train() {} public function predict() {} }
Unsere Emotionsklasse muss zwei Funktionen in unserer Emotionsanalyse -Klasse verwenden:
Erstellen Sie im Stammverzeichnis des Projekts ein Skript mit dem Namen klassifyTweets.php. Wir werden dieses Skript verwenden, um unsere Sentiment -Analyse -Klasse zu instanziieren und zu testen. Hier ist die Vorlage, die wir verwenden werden:
<?php namespace PhpmlExercise; use PhpmlExercise\Classification\SentimentAnalysis; require __DIR__ . '/vendor/autoload.php'; // 步骤 1:加载数据集 // 步骤 2:准备数据集 // 步骤 3:生成训练/测试数据集 // 步骤 4:训练分类器 // 步骤 5:测试分类器的准确性
Wir haben bereits Code, mit dem CSV in unseren früheren Beispielen in das Dataset -Objekt geladen werden kann. Wir werden den gleichen Code verwenden und einige Verbesserungen vornehmen:
<?php ... use Phpml\Dataset\CsvDataset; ... $dataset = new CsvDataset('datasets/clean_tweets.csv',1); $samples = []; foreach ($dataset->getSamples() as $sample) { $samples[] = $sample[0]; }
Dies erzeugt ein flaches Array, das nur Funktionen enthält (in diesem Fall den Tweet -Text), mit dem wir unseren Klassifikator trainieren werden.
Nun ist es nicht nützlich oder genau, den Originaltext zu haben und diesen Text an den Klassifikator zu übergeben, da jeder Tweet im Wesentlichen unterschiedlich ist. Glücklicherweise gibt es Möglichkeiten, Text zu verarbeiten, wenn Sie versuchen, Klassifizierungs- oder maschinelles Lernalgorithmen anzuwenden. In diesem Beispiel werden wir die folgenden zwei Klassen verwenden:
Beginnen wir mit dem Text Vectorizer:
<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>
Wenden Sie als nächstes den TF-IDF-Konverter an:
<code>composer install </code>
Unser Musterarray verwendet jetzt ein Format, das von unserem Klassifikator leicht verstanden werden kann. Wir sind noch nicht fertig, wir müssen jede Probe mit seinen entsprechenden Emotionen markieren.
Zum Glück deckt PHP-ML diese Anforderung bereits ab, und der Code ist sehr einfach:
<?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); }
Wir können diesen Datensatz weiterhin verwenden und unseren Klassifikator trainieren. Es fehlt uns jedoch der als Validierung verwendete Testdatensatz. Wir werden also ein wenig betrügen und unseren ursprünglichen Datensatz in zwei Teile aufteilt: einen Trainingsdatensatz und viel kleinere Daten zum Testen des Genauigkeitssatzes des Modells.
<code>Array( [0] => 569587371693355008 ) Array( [0] => 569587242672398336 ) Array( [0] => 569587188687634433 ) Array( [0] => 569587140490866689 ) </code>
Diese Methode wird als Kreuzvalidierung bezeichnet. Dieser Begriff stammt aus Statistiken und kann wie folgt definiert werden:
Kreuzvalidierung, manchmal als Rotationsschätzung bezeichnet, ist eine Modellüberprüfungstechnik, mit der die Ergebnisse der statistischen Analyse auf unabhängige Datensätze verallgemeinert werden. Es wird hauptsächlich für die Zielsetzung von Vorhersagen verwendet und möchte die Genauigkeit des Vorhersagemodells in der Praxis abschätzen. - Wikipedia.com
Schließlich sind wir bereit, die Sentimentanalyse -Klasse zurückzugeben und umzusetzen. Wenn Sie es noch nicht bemerkt haben, besteht ein großer Teil des maschinellen Lernens darin, Daten zu sammeln und zu manipulieren.
Um unsere Stimmungsanalyseklasse zu implementieren, haben wir drei verfügbare Klassifizierungsalgorithmen:
Für diese Übung werden wir den einfachsten verwenden, den naiven Bayes -Klassifizierer. Lassen Sie uns also weiterhin unsere Klasse aktualisieren, um die Zugmethode zu implementieren:
<?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); }
Wie Sie sehen, lassen wir PHP-ML das ganze schwere Heben für uns durchführen. Wir haben gerade eine schöne Abstraktion für unser Projekt erstellt. Aber woher wissen wir, ob unsere Klassifikatoren wirklich trainieren und arbeiten? Es ist Zeit, unsere Testsampuls und Testlabels zu verwenden.
Wir müssen die Vorhersagemethode implementieren, bevor wir unseren Klassifikator weiter testen:
<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>
In ähnlicher Weise hat PHP-ML uns geholfen und all das schwere Heben für uns gemacht. Lassen Sie uns die Klasse ClassifyTweets entsprechend aktualisieren:
<code>composer install </code>
Schließlich brauchen wir eine Möglichkeit, die Genauigkeit unseres Trainingsmodells zu testen. In unserem Fall interessieren wir uns für die Genauigkeit des Modells. Schauen wir uns den Code an:
<?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); }
wir sollten etwas Ähnliches wie folgt sehen:
<code>Array( [0] => 569587371693355008 ) Array( [0] => 569587242672398336 ) Array( [0] => 569587188687634433 ) Array( [0] => 569587140490866689 ) </code>
Dieser Beitrag ist ein bisschen lang. Lassen Sie uns also überprüfen, was wir bisher gelernt haben:
Dieser Artikel dient auch als Einführung in die PHP-ML-Bibliothek und hofft, Ihnen ein gutes Verständnis für die Funktionen der Bibliothek zu vermitteln und wie Sie sie in Ihre eigenen Projekte einbetten.
Schließlich ist dieser Artikel keineswegs umfassend, und es gibt immer noch viele Dinge zu lernen, zu verbessern und zu experimentieren;
FAQs zum maschinellen Lernen von PHP für Tweet Sentiment Analysis (FAQ)
Kann ich andere Sprachen als PHP für die Stimmungsanalyse verwenden?
Wie kann ich die Stimmungsanalyse für andere Social -Media -Plattformen verwenden?
Kann ich die Sentiment -Analyse für andere Sprachen als Englisch verwenden?
Wie visualisieren Sie die Ergebnisse der Stimmungsanalyse?
Wie kann ich die Stimmungsanalyse in praktischen Anwendungen verwenden?
Wie kann man mit Emojis in der Stimmungsanalyse umgehen?
Wie kann man mit Rechtschreibfehlern in der Stimmungsanalyse umgehen?
Wie kann ich mein Stimmungsanalysemodell auf dem neuesten Stand halten?
Das obige ist der detaillierte Inhalt vonSo analysieren Sie Tweet -Gefühle mit maschinellem PHP -Lernen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!