PHPで機械孊習を䜿甚しおツむヌトのトヌンを分析する方法

すべおの人に良い䞀日を

さお、玄束したずおり、 PHPコヌスの準備で孊習した別の資料を共有しおいたす。 私たちはあなたにずっおそれが興味深く有甚なものになるこずを願っおいたす。

゚ントリヌ

最近、誰もが機械孊習に぀いお話しおいるようです。 ゜ヌシャルメディアフィヌドには、ML、Python、TensorFlow、Spark、Scala、Goなどに関する投皿が詰たっおいたす。 そしお、あなたず私に共通点があるなら、PHPに぀いおはどうですか

はい、機械孊習ずPHPはどうですか 幞いなこずに、誰かがこの質問をするだけでなく、次のプロゞェクトで䜿甚できる汎甚機械孊習ラむブラリを開発するのに倢䞭になりたした。 この投皿では、 PHPの機械孊習ラむブラリであるPHP-MLを芋お、埌で独自のチャットたたはツむヌトボットに䜿甚できる調性分析クラスを䜜成したす。 この投皿の䞻な目的は次のずおりです。




機械孊習ずは䜕ですか

機械孊習は、人工知胜研究の分野のサブセットであり、「コンピュヌタヌに正確にプログラミングされなくおも孊習する機䌚」を提䟛するこずに焊点を圓おおいたす。 これは、特定のデヌタセットから「孊習」できる䞀般的なアルゎリズムを䜿甚しお実珟されたす。

たずえば、機械孊習を䜿甚する䞀般的な方法の1぀は分類です。 分類アルゎリズムは、異なるグルヌプたたはカテゎリにデヌタを配眮するために䜿甚されたす。 分類アプリケヌションの䟋


機械孊習は、さたざたなタスク甚の倚くの汎甚アルゎリズムを含む䞀般的な甚語です。 アルゎリズムには、孊習方法で分類された2぀の䞻芁なタむプがありたす。教垫ずの孊習ず教垫なしの孊習です。

教員逊成

教垫ずの指導では、入力オブゞェクトベクトルの圢匏のトレヌニングデヌタず目的の出力倀を䜿甚しおアルゎリズムをトレヌニングしたす。 アルゎリズムはトレヌニングデヌタを分析し、いわゆる目的関数を䜜成したす。これは、新しいマヌクのないデヌタセットに適甚できたす。

この投皿の残りの郚分では、より芖芚的で関係を確認しやすいずいう理由だけで、教垫ずの授業に焊点を圓おたす。 䞡方のアルゎリズムが同様に重芁で興味深いこずに泚意しおください。 他の人は、教垫なしで孊習するこずは、トレヌニングデヌタの必芁性を排陀するため、より有甚であるず䞻匵したす。

教垫なし孊習

察照的に、このタむプのトレヌニングは、最初からトレヌニングデヌタがなくおも機胜したす。 デヌタセットの望たしい結果倀がわからないため、アルゎリズムがサンプルからのみ結論を匕き出すこずを蚱可したす。 教垫なしで孊習するこずは、デヌタの隠れたパタヌンを明らかにするのに特に䟿利です。

PHP-ML

PHPでの機械孊習ぞの新しいアプロヌチであるず䞻匵するラむブラリであるPHP-MLを玹介したす。 このラむブラリは、アルゎリズム、ニュヌラルネットワヌク、およびデヌタの前凊理、盞互怜蚌、特城抜出のためのツヌルを実装しおいたす。

蚀語の長所は機械孊習の実装にはあたり適しおいないため、PHPは機械孊習にずっお珍しい遞択であるこずに最初に気付くでしょう。 ただし、すべおの機械孊習アプリケヌションがペタバむトのデヌタを凊理しお倧芏暡な蚈算を行う必芁があるわけではありたせん-単玔なアプリケヌションの堎合、十分なPHPずPHP-MLが必芁です

私が今このラむブラリで想像できる最良のナヌスケヌスは、スパムフィルタのようなものであれ、テキストの調性の分析であれ、分類噚を実装するこずです。 プロゞェクトでPHP-MLを䜿甚する方法を芋぀けるために、分類の問題を特定し、段階的に解決策を考えおいきたす。

挑戊する

PHP-MLの実装プロセスを説明し、アプリケヌションに機械孊習を远加するために、解決すべき興味深い問題を芋぀けたいず思っおいたした。分類子を実蚌する最良の方法は、ツむヌトトヌン分析クラスを䜜成するこずです。

機械孊習プロゞェクトを成功させるために必芁な重芁な芁件の1぀は、信頌できる゜ヌスデヌタセットです。 デヌタセットは、すでに分類された䟋で分類噚をトレヌニングできるため、重芁です。 最近、航空䌚瀟を取り巻くメディアで倧きな話題が出おいるので、航空䌚瀟の顧客からのツむヌトよりも良いものはないでしょうか

幞いなこずに、 Kaggle.ioのおかげで、䞀連のツむヌトずしおのデヌタをすでに利甚できたす。 このリンクを䜿甚しお、りェブサむトからUS Airline Sentiment twitterデヌタベヌスをダりンロヌドできたす。

解決策

䜜業䞭のデヌタセットを調べるこずから始めたしょう。 生デヌタセットには次の列がありたす。



そしお、 䟋のように芋えたす


このファむルには14,640個のツむヌトが含たれおいたす-これは十分なデヌタセットです。 これで、非垞に倚くの列を䜿甚できるようになり、䟋に必芁なデヌタよりも倚くのデヌタが埗られたした。 実甚的な目的のために、私たちは次の列にのみ興味がありたす。



textはプロパティで、 airline_sentimentはタヌゲットです。 残りの列は挔習に䜿甚されないため、削陀できたす。 プロゞェクトを䜜成し、次のファむルを䜿甚しおコレクタヌを初期化するこずから始めたす。

 { "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" } 

composer install

Composerの抂芁が必芁な堎合は、 こちらをご芧ください 。

すべおを正しくむンストヌルしたこずを確認するために、 Tweets.csvデヌタTweets.csvを読み蟌むクむックスクリプトを䜜成し、必芁なデヌタが含たれおいるこずを確認したす。 次のコヌドをreviewDataset.phpずしおプロゞェクトのルヌトにコピヌしたす。

 <?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); } 

次に、 reviewDataset.phpスクリプトを実行しお、結果を確認したす。

 Array( [0] => 569587371693355008 ) Array( [0] => 569587242672398336 ) Array( [0] => 569587188687634433 ) Array( [0] => 569587140490866689 ) 

今のずころ䟿利に芋えたせんか CsvDatasetクラスを芋お、内郚で䜕が起こっおいるかをよりよく理解したしょう。

 <?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コンストラクタヌは、3぀の匕数を取りたす。



もう少し詳しく芋おみるず、クラスがCSVファむルを2぀の内郚配列サンプルずタヌゲットに分割しおいるこずがわかりたす。 サンプルにはファむルによっお提䟛されるすべおの関数が含たれ、タヌゲットには既知の倀負、正、たたは䞭立が含たれたす。

䞊蚘に基づいお、CSVファむルの圢匏は次のずおりであるこずがわかりたす。

 | feature_1 | feature_2 | feature_n | target | 

䜜業を継続する必芁がある列のみを䜿甚しお、クリヌンなデヌタセットを䜜成する必芁がありたす。 このスクリプトを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); } 

仕事をするのに十分な耇雑さはありたせん。 phpgenerateCleanDataset.php実行しおみたしょう。

それでは、次に進み、reviewDataset.phpスクリプトをクリヌンなデヌタセットに向けたす。

 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 ) 

バム これが私たちが扱うこずができるデヌタです これたで、デヌタを管理するための簡単なスクリプトを䜜成したした。 次に、 src/class/SentimentAnalysis.php新しいクラスを䜜成したす。

 <?php namespace PhpmlExercise\Classification; /** * Class SentimentAnalysis * @package PhpmlExercise\Classification */ class SentimentAnalysis { public function train() {} public function predict() {} } 

Sentimentクラスには、調性分析クラスの2぀の関数が必芁です。


プロゞェクトのルヌトで、 classifyTweets.phpスクリプトを䜜成したす。 これを䜿甚しお、䞻芁な分析クラスを䜜成およびテストしたす。 䜿甚するテンプレヌトは次のずおりです。

 <?php namespace PhpmlExercise; use PhpmlExercise\Classification\SentimentAnalysis; require __DIR__ . '/vendor/autoload.php'; // Step 1: Load the Dataset // Step 2: Prepare the Dataset // Step 3: Generate the training/testing Dataset // Step 4: Train the classifier // Step 5: Test the classifier accuracy 

ステップ1.デヌタセットをダりンロヌドする

前の䟋からCSVをデヌタオブゞェクトにロヌドするために䜿甚できる基本的なコヌドは既に甚意されおいたす。 いく぀かの小さな倉曎を加えお同じコヌドを䜿甚したす。

 <?php ... use Phpml\Dataset\CsvDataset; ... $dataset = new CsvDataset('datasets/clean_tweets.csv',1); $samples = []; foreach ($dataset->getSamples() as $sample) { $samples[] = $sample[0]; } 

これにより、プロパティのみを含む配列が䜜成されたす。この堎合、分類子のトレヌニングに䜿甚するツむヌトテキストです。

ステップ2デヌタセットの準備

ツむヌトは互いに倧きく異なるため、生のテキストを分類子に枡すず、利益ず正確さが倱われたす。 幞いなこずに、分類アルゎリズムたたは機械孊習アルゎリズムを適甚しようずするずきにテキストを操䜜する方法がありたす。 この䟋では、次の2぀のクラスを䜿甚したす。


テキストベクトラむザヌから始めたしょう

 <?php ... use Phpml\FeatureExtraction\TokenCountVectorizer; use Phpml\Tokenization\WordTokenizer; ... $vectorizer = new TokenCountVectorizer(new WordTokenizer()); $vectorizer->fit($samples); $vectorizer->transform($samples); 

次に、Tf-idfトランスフォヌマヌを適甚したす。

 <?php ... use Phpml\FeatureExtraction\TfIdfTransformer; ... $tfIdfTransformer = new TfIdfTransformer(); $tfIdfTransformer->fit($samples); $tfIdfTransformer->transform($samples); 

サンプルの配列は、分類噚が理解できる圢匏になりたした。 ただ終了しおいたせん。適切なムヌドで各サンプルをマヌクする必芁がありたす。

ステップ3.トレヌニングキットを䜜成する

幞いなこずに、PHP-MLは既にこれを行う方法を知っおおり、コヌドは非垞に単玔です。

 <?php ... use Phpml\Dataset\ArrayDataset; ... $dataset = new ArrayDataset($samples, $dataset->getTargets()); 

このデヌタセットを䜿甚しお、分類噚をトレヌニングできたす。 ただし、テストずしお䜿甚するのに十分なテストデヌタセットがないため、初期デヌタセットを「枬定」しお2぀に分割したすトレヌニング資料のセットず、モデルの粟床を怜蚌するために䜿甚されるはるかに小さなデヌタセットです。

 <?php ... use Phpml\CrossValidation\StratifiedRandomSplit; ... $randomSplit = new StratifiedRandomSplit($dataset, 0.1); $trainingSamples = $randomSplit->getTrainSamples(); $trainingLabels = $randomSplit->getTrainLabels(); $testSamples = $randomSplit->getTestSamples(); $testLabels = $randomSplit->getTestLabels(); 

このアプロヌチは、盞互怜蚌ず呌ばれたす。 この甚語は統蚈に基づいおおり、次のように定矩できたす。

盞互怜蚌盞互怜蚌、ロヌリング制埡、英語の盞互怜蚌-独立したデヌタでの分析モデルずその動䜜を評䟡する方法。 モデルを評䟡するずき、利甚可胜なデヌタはk個の郚分に分割されたす。 次に、デヌタのk-1郚分でモデルトレヌニングが実行され、残りのデヌタがテストに䜿甚されたす。 手順はk回繰り返されたす。 最終的に、k個のデヌタのそれぞれがテストに䜿甚されたす。 その結果、遞択したモデルの有効性が評䟡され、利甚可胜なデヌタが最も均䞀に䜿甚されたす。
-Wikipedia.com

ステップ4分類噚のトレヌニング

最埌に、SentimentAnalysisクラスに戻っお実装する準備が敎いたした。 気づいおいない堎合、機械孊習の倧郚分はデヌタの収集ず凊理に関連しおいたす。 機械孊習モデルの実際の実装は、それほど耇雑ではない傟向がありたす。

ムヌド分析クラスを実装する3぀の分類アルゎリズムがありたす。



この挔習では、最も単玔なNaiveBayes分類子を䜿甚したす。そのため、孊習機胜を実装するためにクラスを継続しお倉曎したす。

 <?php namespace PhpmlExercise\Classification; use Phpml\Classification\NaiveBayes; class SentimentAnalysis { protected $classifier; public function __construct() { $this->classifier = new NaiveBayes(); } public function train($samples, $labels) { $this->classifier->train($samples, $labels); } } 

ご芧のずおり、PHP-MLにすべおのハヌドワヌクを任せたす。 私たちは私たちのプロゞェクトのために少し抜象化するだけです。 しかし、分類噚が本圓に蚓緎されお機胜するかどうかをどのようにしお知るのでしょうか testSamplesずtestLabelsを䜿甚する時間。

ステップ5分類噚の粟床の怜蚌

分類子のテストを続行する前に、予枬メ゜ッドを実装する必芁がありたす。

 <?php ... class SentimentAnalysis { ... public function predict($samples) { return $this->classifier->predict($samples); } } 

たた、PHP-MLが圹立ちたす。 classifyTweetsクラスを次のように倉曎したしょう。

 <?php ... $predictedLabels = $classifier->predict($testSamples); 

最埌に、蚓緎されたモデルの粟床をテストする方法が必芁です。 幞いなこずに、PHP-MLもこれをカバヌしおおり、いく぀かのメトリッククラスがありたす。 この堎合、モデルの粟床に関心がありたす。 コヌドを芋おみたしょう

 <?php ... use Phpml\Metric\Accuracy; ... echo 'Accuracy: '.Accuracy::score($testLabels, $predictedLabels); 

次のようなものが衚瀺されるはずです。

 Accuracy: 0.73651877133106% 

おわりに

この蚘事は倧きすぎるこずがわかったので、孊んだこずを繰り返したしょう。


この投皿は、PHP-MLラむブラリの玹介でもあり、ラむブラリができるこずず、ラむブラリをプロゞェクトに統合する方法に぀いおのアむデアを提䟛しおくれるこずを願っおいたす。

最埌に、この投皿は決しお包括的なものではなく、孊び、改善し、実隓する倚くの機䌚がありたす。 方向性の開発方法に぀いお話し始めるためのアむデアをいく぀か玹介したす。


終わり

い぀ものように、私たちはあなたのコメントや意芋を埅っおいたす。

Source: https://habr.com/ru/post/J345082/


All Articles