この記事は、Wern Anchetaによって査読されました。 SetePointのすべてのピアレビューアーズに感謝します。
最近、誰もが機械学習について話しているようです。ソーシャルメディアのストリームには、ML、Python、Tensorflow、Spark、Scala、Goなどに関する投稿があります。
はい、機械学習とPHPはどうですか?幸いなことに、誰かがこの質問を提起するだけでなく、次のプロジェクトで使用できる一般的な機械学習ライブラリを開発することに夢中でした。この投稿では、PHPの機械学習ライブラリであるPHP-MLをご覧ください。センチメント分析クラスを作成します。センチメント分析クラスは、後で独自のチャットボットやTwitterbotsで再利用できるようにします。この記事の主な目標は次のとおりです
キーポイント
機械学習は、多くの異なるタスクをカバーする一般的なアルゴリズムの一般的な用語であり、主に学習方法に従って2種類のアルゴリズムに分割されています。
監視された学習では、ラベル付きデータを使用してアルゴリズムをトレーニングします。これは、入力オブジェクト(ベクトル)の形式を取得し、アロゴリズムがトレーニングデータを分析し、いわゆる推論関数を生成します。新しい非標識データセット。
この投稿の残りの部分では、監視された学習に焦点を当て、両方のアルゴリズムが等しく重要であると考えていることを覚えておいてください。データのタグ。
php-ml
最初に、PHPは機械学習のための珍しい選択であることを認めます。なぜなら、言語の利点は機械学習アプリケーションにはあまり適していないからです。つまり、すべての機械学習アプリケーションがPEBレベルのデータを処理し、多くの計算を実行する必要があるわけではありません。簡単なアプリケーションでは、PHPとPHP-MLを使用できるはずです。
このライブラリの最良のユースケースは、スパムフィルターであろうとセンチメント分析であろうと、分類子の実装です。分類問題を定義し、プロジェクトでPHP-MLを使用する方法を理解するために、段階的にソリューションを構築します。
質問
成功した機械学習プロジェクトを構築するために必要な重要な要件の1つは、優れた開始データセットです。データセットは、分類器を分類された例に対してトレーニングできるため、重要です。航空会社の最近の大規模な騒音により、航空会社に顧客のツイートを使用するよりも優れたデータセットは何ですか?
幸いなことに、kaggle.ioのおかげで、既にツイートデータセットを使用できます。このリンクを使用して、WebサイトからTwitter US Airlines Sentimentデータベースをダウンロードできます
solution
そして、次の例のように見えます(横にスクロールできるテーブル):
テキストが私たちの特徴になり、Airline_Sentimentが私たちのターゲットになります。残りの列は、私たちの演習では使用されないため廃棄できます。プロジェクトを作成し、次のファイルで作曲家を初期化することから始めましょう。
作曲家の紹介が必要な場合は、こちらを参照してください。
CSVDATASETコンストラクターは、3つのパラメーターを取ります
ファイル内の機能の数の整数を指定
動作を続けるために必要な列のみを含むクリーンなデータセットを生成する必要があります。このスクリプトをgeneratecleandataset.php:と呼びましょう
複雑すぎるものはありません。仕事をするのに十分です。 php generatecleandataset.phpで実行しましょう。 さあ、ReviewDataset.phpスクリプトをクリーンなデータセットに向けましょう: bam!これは私たちが使用できるデータです!これまでのところ、データを操作するための簡単なスクリプトを作成しています。次に、SRC/分類/SentimentAnalysis.phpの下で新しいクラスの作成を開始します。 感情のクラスは、感情分析クラスで2つの機能を使用する必要があります。
データセットを使用してサンプルとラベル、およびいくつかのオプションのパラメーターをトレーニングするトレーニング関数。
今、元のテキストを使用して、そのテキストを分類子に渡すことは、それぞれのツイートが本質的に異なるため、有用でも正確でもありません。幸いなことに、分類または機械学習アルゴリズムを適用しようとするときにテキストを処理する方法があります。この例では、次の2つのクラスを使用します。
回転推定とも呼ばれることもある
センチメント分析クラスを実装するには、3つの利用可能な分類アルゴリズムがあります。
サポートベクトル分類
同様に、PHP-MLは私たちを助け、私たちのためにすべての重い持ち上げをしました。それに応じてclassifytweetsクラスを更新しましょう: 最後に、トレーニングモデルの精度をテストする方法が必要です。私たちの場合、モデルの精度に興味があります。コードを見てみましょう: 次のようなものが表示されるはずです: この投稿は少し長いので、これまでに学んだことを見てみましょう。
センチメント分析における皮肉と反意語のトラブルシューティングは困難な作業です。これらの言語の特徴は、しばしば何かを言うことを伴いますが、反対を意味します。これは、機械学習モデルが理解するのが難しいです。 1つのアプローチは、ディープラーニングモデルなど、コンテキストを理解できるより複雑なモデルを使用することです。別のアプローチは、風刺的なコメントのデータセットを使用してトレーニングできる特殊な風刺検出モデルを使用することです。 感情分析の原則は、他のソーシャルメディアプラットフォームからの投稿を含む、あらゆるテキストデータに適用できます。主な違いは、データを収集する方法です。各ソーシャルメディアプラットフォームには、ユーザー投稿にアクセスするための独自のAPIがあるため、興味のあるプラットフォームのAPIに精通する必要があります。 はい、センチメント分析は任意の言語で使用できます。ただし、分析の有効性は、トレーニングデータの品質に依存します。英語以外の言語を使用している場合は、その言語のデータセットを使用してモデルをトレーニングする必要があります。一部の機械学習ライブラリは、複数の言語も直接サポートしています。 感情分析の結果を視覚化する方法はたくさんあります。一般的なアプローチは、バーチャートを使用して、肯定的、ネガティブ、ニュートラルなツイートの数を示すことです。別のアプローチは、単語クラウドを使用して、データで最も一般的に使用される単語を視覚化することです。 PHPには、PCHARTやGDなどのこれらの視覚化を作成するためのいくつかのライブラリがあります。 感情分析には多くの実用的なアプリケーションがあります。企業はそれを使用して製品やサービスに関する顧客の意見を監視できます。政治家は、政策問題に関する世論を測定するためにそれを使用し、研究者はそれを使用して社会的傾向を研究することができます。可能性は無限です。 絵文字は重要な感情情報を運ぶことができるので、分析にそれらを含めることが重要です。 1つの方法は、データをモデルに入力する前に、各絵文字をテキストの説明に置き換えることです。 PHPの絵文字など、これを行うのに役立つライブラリがあります。 Spellowエラーは、感情分析の課題になる可能性があります。 1つの方法は、モデルにデータを入力する前に、スペルチェッカーを使用してエラーを修正することです。別のアプローチは、ディープラーニングモデルなどのスペルエラーを処理できるモデルを使用することです。 センチメント分析モデルを最新の状態に保つには、新しいデータを使用して定期的に再訓練することが含まれます。これにより、モデルが言語の使用や感情的な変化と同期していることが保証されます。モデルを再訓練する計画を設定することにより、このプロセスを自動化できます。 tweet_id
airline_sentiment
airline_sentiment_confience_confidence
negativereason
negativereason_confidence negativereason_confidence namenegativer eason_gold retweet_count text
user_timezone
570306133677777777777777777777777777777777777777760513 (米国とカナダ)570301130888122368ポジティブ0.3486 0.0 Virgin America 0 @VirginAmerica Prusあなたは体験にコマーシャルを追加しました…5703010836728133371 America Yvonnalynn 0 @VirginAmerica私は今日ではありませんでした... 2015-02-24 11:15:48 -0800 jnardino 0“ @virginAmericaゲストの顔に不快な「エンターテイメント」を爆破するのは本当に攻撃的であり、彼らは少し頼りになっています」 1.0 virgin America Jnardino 0 @VirginAmericaを伝えることはできません。それはそれについて本当に大きな悪いことです2015-02-24 11:14:45 -0800 Pacific Time(US&Canada)570300767074181121ネガティブ1.0 0「@VirginAmericaは、この演奏がなかった座席に30ドルを支払います。ポジティブ0.6745 0.0バージンアメリカCJmcginnis 0カナダ)57030024855349120ニュートラル0.634バージンアメリカパイロット0 11:12:29 -0800ロサンゼルスパシフィックタイム(US&カナダ)このファイルには14,640のツイートが含まれているため、私たちにとってはうまく機能するデータセットです。現在、私たちが持っている列の数があるので、実用的な目的よりも多くのデータがあります。
<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);
}
上記のコンテンツに基づいて、CSVファイルが従う必要がある形式は次のとおりです。
<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() {}
}
ステップ2:データセットを準備
トークンカウントベクター化器:これにより、テキストサンプルセットがトークンカウントベクトルに変換されます。基本的に、ツイートの各単語は一意の数字になり、特定のテキストサンプルに単語が表示される回数を追跡します。
テキストベクトル化者から始めましょう:<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-MLはすでにこの要件をカバーしており、コードは非常に簡単です:<?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>
最後に、センチメンタナリシスクラスを返して実装する準備ができました。まだ気づいていない場合、機械学習の大部分は、データを収集して操作することです。
knearest neighbor
ステップ5:分類器の精度をテスト<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-MLライブラリの紹介としても機能し、ライブラリの機能と自分のプロジェクトに埋め込む方法をよく理解したいと考えています。
ツイートセンチメント分析のためのPHP機械学習のFAQ(FAQ)
感情分析の精度を改善するには、さまざまな戦略が含まれます。まず、トレーニングデータが可能な限りクリーンで関連性があることを確認してください。これは、停止単語、句読点、URLなどの無関係なデータを削除することを意味します。次に、より複雑なアルゴリズムの使用を検討します。ナイーブベイズ分類器は優れた出発点ですが、サポートベクターマシン(SVM)やディープラーニングモデルなどの他のアルゴリズムがより良い結果をもたらす可能性があります。最後に、トレーニングに大きなデータセットを使用することを検討してください。モデルが学習できるデータが多いほど、より正確になります。
感情分析にPHP以外の言語を使用できますか?
感情分析において皮肉と反意語に対処する方法は?
他のソーシャルメディアプラットフォームにセンチメント分析を使用する方法は?
英語以外の言語でセンチメント分析を使用できますか?
感情分析の結果を視覚化する方法は?
実際のアプリケーションでセンチメント分析を使用する方法は?
センチメント分析で絵文字に対処する方法は?
センチメント分析でスペルミスを扱う方法は?
私のセンチメント分析モデルを最新の状態に保つ方法は?
以上がPHP機械学習でツイート感情を分析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。