Rumah >pembangunan bahagian belakang >tutorial php >Cara Menganalisis Sentimen Tweet Dengan Pembelajaran Mesin PHP
Artikel ini telah dikaji semula oleh Wern Ancheta. Terima kasih kepada semua pengulas rakan sebaya di SitePoint untuk mendapatkan kandungan SitePoint dengan sebaik -baiknya!
Ya, bagaimana dengan pembelajaran mesin dan PHP? Nasib baik, seseorang gila bukan sahaja menimbulkan persoalan ini, tetapi juga membangunkan perpustakaan pembelajaran mesin umum yang boleh kita gunakan dalam projek seterusnya. Dalam jawatan ini, kami akan melihat PHP-ML-perpustakaan pembelajaran mesin untuk PHP-kami akan menulis kelas analisis sentimen yang boleh digunakan semula kemudian untuk chatbots atau Twitterbots kami sendiri. Matlamat utama artikel ini adalah:
Baca buku ini Baca buku ini!
Penggunaan umum pembelajaran mesin, sebagai contoh, adalah klasifikasi. Algoritma klasifikasi digunakan untuk membahagikan data ke dalam kumpulan atau kategori yang berbeza. Beberapa contoh aplikasi klasifikasi termasuk:
Pembelajaran mesin adalah istilah umum untuk algoritma umum yang meliputi banyak tugas yang berbeza, dan ia dibahagikan kepada dua jenis algoritma mengikut kaedah pembelajaran - pembelajaran yang diawasi dan pembelajaran tanpa pengawasan.
Dalam pembelajaran yang diawasi, kami menggunakan data berlabel untuk melatih algoritma kami, yang mengambil format objek input (vektor) dan nilai output yang diperlukan; dataset baru yang tidak berlabel.
untuk sisa jawatan ini, kami akan memberi tumpuan kepada pembelajaran yang diawasi kerana lebih mudah untuk melihat dan mengesahkan hubungan; untuk menandakan data.
Jenis pembelajaran ini, sebaliknya, menggunakan data yang tidak berlabel dari awal. Kami tidak tahu nilai output yang diperlukan dari dataset, jadi kami membiarkan algoritma membuat kesimpulan dari dataset;
tahu php-ml, perpustakaan yang mendakwa sebagai kaedah baru pembelajaran mesin php. Perpustakaan melaksanakan algoritma, rangkaian saraf dan alat untuk pra-proses pra-proses, pengesahan silang, dan pengekstrakan ciri.
Saya mula -mula mengakui bahawa PHP adalah pilihan yang luar biasa untuk pembelajaran mesin, kerana kelebihan bahasa tidak begitu sesuai untuk aplikasi pembelajaran mesin. Iaitu, tidak setiap aplikasi pembelajaran mesin perlu memproses data peringkat PEB dan melakukan banyak perhitungan-untuk aplikasi mudah, kita harus dapat menggunakan PHP dan PHP-ML.
Kes penggunaan terbaik untuk perpustakaan ini yang dapat saya lihat sekarang ialah pelaksanaan pengelas, sama ada penapis spam atau analisis sentimen. Kami akan menentukan masalah klasifikasi dan membina langkah penyelesaian demi langkah untuk memahami cara menggunakan PHP-ML dalam projek kami.
Salah satu keperluan utama yang diperlukan untuk membina projek pembelajaran mesin yang berjaya adalah dataset permulaan yang baik. Dataset adalah penting kerana mereka akan membolehkan kami melatih pengelas kami terhadap contoh dikelaskan. Dengan bunyi bising besar -besaran di sekitar syarikat penerbangan, apakah set data yang lebih baik daripada menggunakan tweet pelanggan ke syarikat penerbangan?
bernasib baik, terima kasih kepada kaggle.io, kita sudah boleh menggunakan dataset tweet. Anda boleh menggunakan pautan ini untuk memuat turun pangkalan data sentimen Twitter US Airlines dari laman web mereka
Penyelesaian
dan kelihatan seperti contoh berikut (jadual yang boleh ditatal ke sisi):
di mana teks akan menjadi ciri dan syarikat penerbangan kami akan menjadi sasaran kami. Lajur yang tinggal boleh dibuang kerana mereka tidak akan digunakan dalam latihan kami. Mari kita mulakan dengan membuat projek dan memulakan komposer dengan fail berikut: Jika anda memerlukan pengenalan komposer, lihat di sini. Untuk memastikan kami menetapkannya dengan betul, mari buat skrip cepat yang akan memuatkan fail data tweets.csv kami dan pastikan ia mempunyai data yang kami perlukan. Salin kod berikut sebagai reviewdataset.php dalam direktori root projek: Sekarang, jalankan skrip menggunakan php reviewdataset.php, mari kita lihat output: Ini kelihatan tidak berguna sekarang, bukan? Mari kita lihat kelas csvDataset untuk lebih memahami apa yang berlaku di dalam: pembina csvDataset mengambil 3 parameter: Jika kita melihat dengan teliti, kita dapat melihat bahawa kelas memetakan fail CSV ke dua array dalaman: sampel dan sasaran. Sampel mengandungi semua ciri yang disediakan oleh fail, manakala sasaran mengandungi nilai yang diketahui (negatif, positif, atau neutral). Berdasarkan kandungan di atas, kita dapat melihat bahawa format yang perlu diikuti oleh format CSV adalah seperti berikut: kita perlu menghasilkan dataset bersih yang hanya mengandungi lajur yang kita perlukan untuk terus bekerja. Mari panggil skrip ini generatecleandataset.php: Tidak ada yang terlalu rumit, cukup untuk melakukan pekerjaan itu. Mari kita laksanakan dengan php generatecleandataset.php. Sekarang, mari kita tunjukkan skrip ReviewDataset.php ke dataset yang bersih: bam! Inilah data yang boleh kita gunakan! Setakat ini, kami telah membuat skrip mudah untuk memanipulasi data. Seterusnya, kami akan mula membuat kelas baru di bawah SRC/klasifikasi/sentimenalysis.php. kelas emosi kita perlu menggunakan dua fungsi dalam kelas analisis emosi kita: Buat skrip bernama ClassifyTweets.php dalam direktori root projek. Kami akan menggunakan skrip ini untuk instantiate dan menguji kelas analisis sentimen kami. Inilah templat yang akan kami gunakan: Kami sudah mempunyai kod yang boleh digunakan untuk memuatkan CSV ke dalam objek dataset dalam contoh terdahulu kami. Kami akan menggunakan kod yang sama dan membuat beberapa tweak: Ini akan menghasilkan array rata yang mengandungi hanya ciri -ciri (dalam kes ini teks tweet) yang akan kami gunakan untuk melatih pengelas kami. Sekarang, mempunyai teks asal dan lulus teks itu kepada pengelas tidak akan berguna atau tepat, kerana setiap tweet pada dasarnya berbeza. Nasib baik, ada cara untuk memproses teks apabila cuba menggunakan klasifikasi atau algoritma pembelajaran mesin. Untuk contoh ini, kami akan menggunakan dua kelas berikut: mari kita mulakan dengan teks vektorizer: Seterusnya, gunakan penukar TF-IDF: Sampel kami array kini menggunakan format yang dapat difahami dengan mudah oleh pengelas kami. Kami belum selesai, kita perlu menandakan setiap sampel dengan emosi yang sepadan. bernasib baik, php-ml sudah meliputi keperluan ini, dan kodnya sangat mudah: kita boleh terus menggunakan dataset ini dan melatih pengelas kami. Walau bagaimanapun, kami tidak mempunyai dataset ujian yang digunakan sebagai pengesahan, jadi kami akan "menipu" sedikit dan memecah dataset asal kami ke dalam dua bahagian: dataset latihan dan data yang lebih kecil untuk menguji set ketepatan model. Kaedah ini dipanggil silang-validasi. Istilah ini berasal dari statistik dan boleh ditakrifkan seperti berikut: Pengesahan silang, kadang -kadang dipanggil anggaran putaran, adalah teknik pengesahan model yang digunakan untuk menilai bagaimana hasil analisis statistik akan umum kepada set data bebas. Ia digunakan terutamanya untuk penetapan matlamat ramalan dan mahu menganggarkan ketepatan model ramalan dalam amalan. - wikipedia.com Akhirnya, kami bersedia untuk kembali dan melaksanakan kelas sentimenalisis. Jika anda belum perasan lagi, sebahagian besar pembelajaran mesin adalah mengenai mengumpul dan memanipulasi data; Untuk melaksanakan kelas analisis sentimen kami, kami mempunyai tiga algoritma klasifikasi yang ada: Untuk latihan ini, kami akan menggunakan yang paling mudah, pengelas Bayes naif, jadi mari terus mengemas kini kelas kami untuk melaksanakan kaedah kereta api: Seperti yang anda lihat, kami membiarkan PHP-ML melakukan semua mengangkat berat untuk kami. Kami hanya mencipta abstraksi yang bagus untuk projek kami. Tetapi bagaimana kita tahu jika pengelas kita benar -benar latihan dan bekerja? Sudah tiba masanya untuk menggunakan testsamples dan testlabels kami. kita perlu melaksanakan kaedah ramalan sebelum kita terus menguji pengelas kita: Begitu juga, PHP-ML membantu kami dan melakukan semua pengangkat berat untuk kami. Mari kita kemas kini kelas ClassifyTweets dengan sewajarnya: Akhirnya, kita memerlukan cara untuk menguji ketepatan model latihan kami; Dalam kes kami, kami berminat dengan ketepatan model. Mari lihat kod: kita harus melihat sesuatu yang serupa dengan yang berikut: jawatan ini agak lama, jadi mari kita semak apa yang telah kita pelajari setakat ini: Artikel ini juga berfungsi sebagai pengenalan kepada perpustakaan PHP-ML dan berharap dapat memberi anda pemahaman yang baik tentang ciri-ciri perpustakaan dan bagaimana untuk membenamkannya dalam projek anda sendiri. Akhirnya, artikel ini tidak semestinya komprehensif, dan masih terdapat banyak perkara untuk belajar, memperbaiki dan mencuba;
Penyelesaian masalah ironi dan antonim dalam analisis sentimen adalah tugas yang mencabar. Ciri -ciri bahasa ini sering melibatkan sesuatu tetapi bermakna sebaliknya, yang sukar untuk difahami oleh model pembelajaran mesin. Satu pendekatan adalah menggunakan model yang lebih kompleks yang dapat memahami konteksnya, seperti model pembelajaran mendalam. Pendekatan lain ialah menggunakan model pengesanan satirikal khusus yang boleh dilatih menggunakan dataset komen satir. Prinsip analisis sentimen boleh digunakan untuk sebarang data teks, termasuk jawatan dari platform media sosial yang lain. Perbezaan utama ialah bagaimana anda mengumpul data. Setiap platform media sosial mempunyai API sendiri untuk mengakses jawatan pengguna, jadi anda perlu mengenali API platform yang anda minati. Ya, analisis sentimen boleh digunakan dalam mana -mana bahasa. Walau bagaimanapun, keberkesanan analisis bergantung kepada kualiti data latihan anda. Jika anda menggunakan bahasa selain bahasa Inggeris, anda perlu menggunakan dataset bahasa itu untuk melatih model anda. Sesetengah perpustakaan pembelajaran mesin juga secara langsung menyokong pelbagai bahasa. Terdapat banyak cara untuk memvisualisasikan hasil analisis sentimen. Pendekatan yang sama adalah menggunakan carta bar untuk menunjukkan bilangan tweet positif, negatif, dan neutral. Pendekatan lain adalah menggunakan awan perkataan untuk memvisualisasikan kata -kata yang paling biasa digunakan dalam data. PHP mempunyai beberapa perpustakaan untuk mewujudkan visualisasi ini, seperti PCHART dan GD. Analisis emosi mempunyai banyak aplikasi praktikal. Perniagaan boleh menggunakannya untuk memantau pendapat pelanggan mengenai produk atau perkhidmatan mereka, ahli politik boleh menggunakannya untuk mengukur pendapat umum mengenai isu -isu dasar, dan penyelidik boleh menggunakannya untuk mengkaji trend sosial. Kemungkinannya tidak berkesudahan. emojis boleh membawa maklumat emosi yang penting, jadi penting untuk memasukkannya dalam analisis anda. Salah satu cara ialah menggantikan setiap emoji dengan keterangan teksnya sebelum memasukkan data ke dalam model. Terdapat perpustakaan yang dapat membantu anda melakukan ini, seperti emojione PHP. Kesalahan spellow boleh menjadi cabaran dalam analisis sentimen. Salah satu cara ialah menggunakan pemeriksa ejaan untuk membetulkan ralat sebelum memasukkan data ke dalam model. Pendekatan lain ialah menggunakan model yang boleh mengendalikan kesilapan ejaan, seperti model pembelajaran mendalam. Memelihara model analisis sentimen anda yang terkini melibatkan latihan semula dengan kerap menggunakan data baru. Ini memastikan bahawa model anda selaras dengan penggunaan bahasa dan perubahan emosi. Anda boleh mengautomasikan proses ini dengan menyediakan rancangan untuk melatih semula model. tweet_id Airline_SenTiment_Gold name negativereason_gold retweet_count tweet_coord tweet_creat ed tweet_location user_timeZone 570306133677760513 Neutral 1.0 Virgin America Cairdin 0 @virginamerica Apa @dhepburn berkata. (US & Canada) 57030111308888122368 Positif 0.3486 0.0 Virgin America Jnardino 0 @virginamerica ditambah anda telah menambah iklan kepada pengalaman ... Tacky. America Yvonnalynn 0 @virginamerica Saya tidak hari ini ... mesti saya perlu mengambil perjalanan lain! Jnardino 0 "@virginamerica Ia benar-benar agresif untuk meletupkan" "hiburan" "di wajah tetamu anda & mereka mempunyai sedikit bantuan" 2015-02-24 11:15:36 -0800 P Acific Time (AS & CANADA) Tidak dapat memberitahu 1.0 Virgin America Jnardino 0 @virginamerica dan ia adalah perkara buruk yang sangat besar mengenainya 2015-02-24 11:14:45 -0800 Pacific Time (US & Canada) 570300767074181121 Negatif 1.0 Tidak dapat memberitahu 0.6842 Virgin America Jnardino 0 "@virginamerica serius akan membayar $ 30 penerbangan untuk tempat duduk yang tidak mempunyai permainan ini. Positif 0.6745 0.0 Virgin America CJMcginnis 0 "@virginamerica Ya hampir setiap kali saya terbang vx ini" cacing telinga "tidak akan pergi :)" 2015-02-24 11:13:57 -0800 San Francisco CA Pacific Time (AS & Kanada) 570300248553349120 Neutral 0.634 Virgin America Pilot 0 "@virginamerica benar-benar terlepas peluang utama untuk lelaki tanpa parodi di sana 11:12:29 -0800 Los Angeles Pacific Time (US & Canada) Fail ini mengandungi 14,640 tweet, jadi ia adalah dataset kerja yang baik untuk kami. Sekarang, dengan bilangan lajur yang kami ada sekarang, kami mempunyai lebih banyak data daripada contoh yang diperlukan;
<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>
<code class="language-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);
}
</code>
<code>Array( [0] => 569587371693355008 )
Array( [0] => 569587242672398336 )
Array( [0] => 569587188687634433 )
Array( [0] => 569587140490866689 )
</code>
<code class="language-php"><?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>
<code>| feature_1 | feature_2 | feature_n | target | </code>
<code class="language-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);
}
</code>
<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>
<code class="language-php"><?php namespace PhpmlExercise\Classification;
/**
* Class SentimentAnalysis
* @package PhpmlExercise\Classification
*/
class SentimentAnalysis {
public function train() {}
public function predict() {}
}
</code>
<code class="language-php"><?php
namespace PhpmlExercise;
use PhpmlExercise\Classification\SentimentAnalysis;
require __DIR__ . '/vendor/autoload.php';
// 步骤 1:加载数据集
// 步骤 2:准备数据集
// 步骤 3:生成训练/测试数据集
// 步骤 4:训练分类器
// 步骤 5:测试分类器的准确性
</code>
Langkah 1: Muatkan dataset
<code class="language-php"><?php ...
use Phpml\Dataset\CsvDataset;
...
$dataset = new CsvDataset('datasets/clean_tweets.csv',1);
$samples = [];
foreach ($dataset->getSamples() as $sample) {
$samples[] = $sample[0];
}
</code>
Langkah 2: Sediakan dataset
<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>
Langkah 3: Menjana dataset latihan
<code class="language-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);
}
</code>
<code>Array( [0] => 569587371693355008 )
Array( [0] => 569587242672398336 )
Array( [0] => 569587188687634433 )
Array( [0] => 569587140490866689 )
</code>
Langkah 4: Latihan Pengelas
<code class="language-php"><?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>
Langkah 5: Uji ketepatan pengelas
<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>
<code class="language-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);
}
</code>
<code>Array( [0] => 569587371693355008 )
Array( [0] => 569587242672398336 )
Array( [0] => 569587188687634433 )
Array( [0] => 569587140490866689 )
</code>
Kesimpulan
Gantikan algoritma Naive Bayes dengan algoritma mesin vektor sokongan.
Saya harap anda dapati artikel ini berguna. Jika anda mempunyai beberapa idea aplikasi atau sebarang pertanyaan mengenai PHP-ML, jangan ragu untuk menyebutnya di bahagian komen di bawah!
Bagaimana untuk meningkatkan ketepatan analisis sentimen?
Meningkatkan ketepatan analisis sentimen melibatkan pelbagai strategi. Pertama, pastikan data latihan anda bersih dan relevan mungkin. Ini bermakna memadam sebarang data yang tidak berkaitan seperti kata -kata berhenti, tanda baca, dan URL. Kedua, pertimbangkan untuk menggunakan algoritma yang lebih kompleks. Walaupun pengelas Bayes Naive adalah titik permulaan yang hebat, algoritma lain seperti mesin vektor sokongan (SVM) atau model pembelajaran mendalam mungkin memberikan hasil yang lebih baik. Akhirnya, pertimbangkan untuk menggunakan dataset yang lebih besar untuk latihan. Lebih banyak data model anda boleh belajar, semakin tepatnya.
Ya, anda boleh menggunakan bahasa pengaturcaraan lain untuk analisis sentimen. Sebagai contoh, Python telah menjadi pilihan yang popular untuk perpustakaan pembelajaran mesinnya yang luas seperti NLTK, TextBlob, dan Scikit-Learn. Walau bagaimanapun, PHP juga boleh digunakan dengan berkesan untuk analisis sentimen, terutamanya jika anda sudah biasa dengan bahasa atau jika projek anda dibina di atas kerangka PHP.
Bagaimana menangani ironi dan antonim dalam analisis emosi?
Bagaimana menggunakan analisis sentimen untuk platform media sosial yang lain?
Bolehkah saya menggunakan analisis sentimen untuk bahasa selain bahasa Inggeris?
Bagaimana untuk memvisualisasikan hasil analisis sentimen?
Bagaimana menggunakan analisis sentimen dalam aplikasi praktikal?
Bagaimana menangani emojis dalam analisis sentimen?
Bagaimana menangani kesilapan ejaan dalam analisis sentimen?
Bagaimana untuk mengekalkan model analisis sentimen saya terkini?
Atas ialah kandungan terperinci Cara Menganalisis Sentimen Tweet Dengan Pembelajaran Mesin PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!