Tutorial: Menganalisis sentimen komentar situs web dengan klasifikasi biner di ML.NET
Tutorial ini menunjukkan kepada Anda cara membuat aplikasi konsol .NET Core yang mengklasifikasikan sentimen dari komentar situs web dan mengambil tindakan yang sesuai. Pengklasifikasi sentimen biner menggunakan C# di Visual Studio 2022.
Dalam tutorial ini, Anda akan mempelajari cara:
- Membuat aplikasi konsol
- Siapkan data
- Muat data
- Membangun dan melatih model
- Mengevaluasi model
- Menggunakan model untuk membuat prediksi
- Lihat hasilnya
Anda dapat menemukan kode sumber untuk tutorial ini di repositori dotnet/samples .
Prasyarat
Membuat aplikasi konsol
Buat Aplikasi Konsol C# yang disebut "SentimentAnalysis". Klik tombol Berikutnya.
Pilih .NET 6 sebagai kerangka kerja yang akan digunakan. Klik tombol Buat.
Buat direktori bernama Data dalam proyek Anda untuk menyimpan file himpunan data Anda.
Instal Paket Microsoft.ML NuGet:
Catatan
Sampel ini menggunakan versi stabil terbaru dari paket NuGet yang disebutkan kecuali dinyatakan lain.
Di Penjelajah Solusi, klik kanan proyek Anda dan pilih Kelola Paket NuGet. Pilih "nuget.org" sebagai sumber paket, lalu pilih tab Telusuri . Cari Microsoft.ML, pilih paket yang Anda inginkan, lalu pilih tombol Instal . Lanjutkan dengan penginstalan dengan menyetujui ketentuan lisensi untuk paket yang Anda pilih.
Menyiapkan data Anda
Catatan
Himpunan data untuk tutorial ini berasal dari 'Dari Grup ke Label Individual menggunakan Fitur Mendalam', Kotzias et. Al. KDD 2015, dan dihosting di Repositori Pembelajaran Mesin UCI - Dua, D. dan Karra Taniskidou, E. (2017). Repositori Pembelajaran Mesin UCI [http://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information dan Computer Science.
Unduh file ZIP himpunan data Kalimat Berlabel Sentimen UCI, dan unzip.
yelp_labelled.txt
Salin file ke direktori Data yang Anda buat.Di Penjelajah Solusi, klik
yelp_labeled.txt
kanan file dan pilih Properti. Di bawah Tingkat Lanjut, ubah nilai Salin ke Direktori Output menjadi Salin jika lebih baru.
Membuat kelas dan menentukan jalur
Tambahkan pernyataan tambahan
using
berikut ke bagian atas file Program.cs :using Microsoft.ML; using Microsoft.ML.Data; using SentimentAnalysis; using static Microsoft.ML.DataOperationsCatalog;
Tambahkan kode berikut ke baris tepat di bawah
using
pernyataan, untuk membuat bidang untuk menyimpan jalur file himpunan data yang baru diunduh:string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "yelp_labelled.txt");
Selanjutnya, buat kelas untuk data input dan prediksi Anda. Tambahkan kelas baru ke proyek Anda:
Di Penjelajah Solusi, klik kanan proyek Anda dan pilih Tambahkan>Item baru.
Dalam kotak dialog Tambahkan Item Baru , pilih Kelas dan ubah bidang Nama menjadi SentimentData.cs. Kemudian, pilih tombol Tambahkan .
File SentimentData.cs terbuka di editor kode. Tambahkan pernyataan berikut
using
ke bagian atas SentimentData.cs:using Microsoft.ML.Data;
Hapus definisi kelas yang ada dan tambahkan kode berikut, yang memiliki dua kelas
SentimentData
danSentimentPrediction
, ke file SentimentData.cs :public class SentimentData { [LoadColumn(0)] public string? SentimentText; [LoadColumn(1), ColumnName("Label")] public bool Sentiment; } public class SentimentPrediction : SentimentData { [ColumnName("PredictedLabel")] public bool Prediction { get; set; } public float Probability { get; set; } public float Score { get; set; } }
Bagaimana data disiapkan
Kelas himpunan data input, SentimentData
, memiliki string
untuk komentar pengguna (SentimentText
) dan bool
Sentiment
() nilai 1 (positif) atau 0 (negatif) untuk sentimen. Kedua bidang memiliki atribut LoadColumn yang melekat padanya, yang menjelaskan urutan file data dari setiap bidang. Selain itu, Sentiment
properti memiliki atribut ColumnName untuk menunjuknya sebagai Label
bidang . Contoh file berikut tidak memiliki baris header, dan terlihat seperti ini:
SentimentText | Sentimen (Label) |
---|---|
Pelayan agak lambat dalam pelayanan. | 0 |
Crust tidak baik. | 0 |
Wow... Mencintai tempat ini. | 1 |
Layanan sangat cepat. | 1 |
SentimentPrediction
adalah kelas prediksi yang digunakan setelah pelatihan model. Ini mewarisi dari SentimentData
sehingga input SentimentText
dapat ditampilkan bersama dengan prediksi output. Prediction
Boolean adalah nilai yang diprediksi model ketika disediakan dengan input SentimentText
baru .
Kelas SentimentPrediction
output berisi dua properti lain yang dihitung oleh model: Score
- skor mentah yang dihitung oleh model, dan Probability
- skor yang dikalibrasi dengan kemungkinan teks memiliki sentimen positif.
Untuk tutorial ini, properti yang paling penting adalah Prediction
.
Muat data
Data dalam ML.NET direpresentasikan sebagai antarmuka IDataView. IDataView
adalah cara yang fleksibel dan efisien untuk menjelaskan data tabular (numerik dan teks). Data dapat dimuat dari file teks atau secara real time (misalnya, database SQL atau file log) ke IDataView
objek.
Kelas MLContext adalah titik awal untuk semua operasi ML.NET. Menginisialisasi mlContext
membuat lingkungan ML.NET baru yang dapat dibagikan di seluruh objek alur kerja pembuatan model. Ini mirip, secara konseptual, ke DBContext
dalam Kerangka Kerja Entitas.
Anda menyiapkan aplikasi, lalu memuat data:
Console.WriteLine("Hello World!")
Ganti baris dengan kode berikut untuk mendeklarasikan dan menginisialisasi variabel mlContext:MLContext mlContext = new MLContext();
Tambahkan yang berikut ini sebagai baris kode berikutnya:
TrainTestData splitDataView = LoadData(mlContext);
Buat
LoadData()
metode di bagianProgram.cs
bawah file menggunakan kode berikut:TrainTestData LoadData(MLContext mlContext) { }
Metode menjalankan
LoadData()
tugas-tugas berikut:- Memuat data.
- Membagi himpunan data yang dimuat menjadi himpunan data pelatihan dan pengujian.
- Mengembalikan himpunan data pelatihan dan pengujian terpisah.
Tambahkan kode berikut sebagai baris pertama metode
LoadData()
:IDataView dataView = mlContext.Data.LoadFromTextFile<SentimentData>(_dataPath, hasHeader: false);
Metode LoadFromTextFile() menentukan skema data dan membaca dalam file. Dibutuhkan variabel jalur data dan mengembalikan
IDataView
.
Memisahkan himpunan data untuk pelatihan dan pengujian model
Saat menyiapkan model, Anda menggunakan bagian dari himpunan data untuk melatihnya dan bagian dari himpunan data untuk menguji akurasi model.
Untuk membagi data yang dimuat ke dalam himpunan data yang diperlukan, tambahkan kode berikut sebagai baris berikutnya dalam
LoadData()
metode :TrainTestData splitDataView = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);
Kode sebelumnya menggunakan metode TrainTestSplit() untuk membagi himpunan data yang dimuat menjadi himpunan data pelatihan dan pengujian dan mengembalikannya di DataOperationsCatalog.TrainTestData kelas . Tentukan persentase kumpulan pengujian data dengan
testFraction
parameter . Defaultnya adalah 10%, dalam hal ini Anda menggunakan 20% untuk mengevaluasi lebih banyak data.Mengembalikan di
splitDataView
akhirLoadData()
metode:return splitDataView;
Membangun dan melatih model
Tambahkan panggilan berikut ke metode di
BuildAndTrainModel
bawah panggilan keLoadData
metode :ITransformer model = BuildAndTrainModel(mlContext, splitDataView.TrainSet);
Metode menjalankan
BuildAndTrainModel()
tugas-tugas berikut:- Mengekstrak dan mengubah data.
- Melatih model.
- Memprediksi sentimen berdasarkan data pengujian.
- Mengembalikan model.
BuildAndTrainModel()
Buat metode , di bawahLoadData()
metode , menggunakan kode berikut:ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet) { }
Mengekstrak dan mengubah data
Panggil
FeaturizeText
sebagai baris kode berikutnya:var estimator = mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(SentimentData.SentimentText))
Metode
FeaturizeText()
dalam kode sebelumnya mengonversi kolom teks (SentimentText
) menjadi kolom jenisFeatures
kunci numerik yang digunakan oleh algoritma pembelajaran mesin dan menambahkannya sebagai kolom himpunan data baru:SentimentText Sentimen Fitur Pelayan agak lambat dalam pelayanan. 0 [0.76, 0.65, 0.44, ...] Crust tidak baik. 0 [0.98, 0.43, 0.54, ...] Wow... Mencintai tempat ini. 1 [0.35, 0.73, 0.46, ...] Layanan sangat cepat. 1 [0.39, 0, 0.75, ...]
Menambahkan algoritma pembelajaran
Aplikasi ini menggunakan algoritma klasifikasi yang mengategorikan item atau baris data. Aplikasi ini mengategorikan komentar situs web sebagai positif atau negatif, jadi gunakan tugas klasifikasi biner.
Tambahkan tugas pembelajaran mesin ke definisi transformasi data dengan menambahkan yang berikut ini sebagai baris kode berikutnya di BuildAndTrainModel()
:
.Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));
SdcaLogisticRegressionBinaryTrainer adalah algoritma pelatihan klasifikasi Anda. Ini ditambahkan ke estimator
dan menerima parameter yang ditampilkan SentimentText
(Features
) dan Label
input untuk dipelajari dari data historis.
Latih model
Paskan model ke splitTrainSet
data dan kembalikan model terlatih dengan menambahkan yang berikut ini sebagai baris kode berikutnya dalam BuildAndTrainModel()
metode :
Console.WriteLine("=============== Create and Train the Model ===============");
var model = estimator.Fit(splitTrainSet);
Console.WriteLine("=============== End of training ===============");
Console.WriteLine();
Metode Fit() melatih model Anda dengan mengubah himpunan data dan menerapkan pelatihan.
Mengembalikan model yang dilatih untuk digunakan untuk evaluasi
Kembalikan model di akhir BuildAndTrainModel()
metode:
return model;
Mengevaluasi model
Setelah model Anda dilatih, gunakan data pengujian Anda untuk memvalidasi performa model.
Evaluate()
Buat metode , tepat setelahBuildAndTrainModel()
, dengan kode berikut:void Evaluate(MLContext mlContext, ITransformer model, IDataView splitTestSet) { }
Metode menjalankan
Evaluate()
tugas-tugas berikut:- Memuat himpunan data pengujian.
- Membuat evaluator BinaryClassification.
- Mengevaluasi model dan membuat metrik.
- Menampilkan metrik.
Tambahkan panggilan ke metode baru di bawah
BuildAndTrainModel
panggilan metode menggunakan kode berikut:Evaluate(mlContext, model, splitDataView.TestSet);
splitTestSet
Ubah data dengan menambahkan kode berikut keEvaluate()
:Console.WriteLine("=============== Evaluating Model accuracy with Test data==============="); IDataView predictions = model.Transform(splitTestSet);
Kode sebelumnya menggunakan metode Transform() untuk membuat prediksi untuk beberapa baris input yang disediakan dari himpunan data pengujian.
Evaluasi model dengan menambahkan yang berikut ini sebagai baris kode berikutnya dalam
Evaluate()
metode :CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");
Setelah Anda memiliki set prediksi (predictions
), metode Evaluate() menilai model, yang membandingkan nilai yang diprediksi dengan aktual dalam himpunan Labels
data pengujian dan mengembalikan objek CalibratedBinaryClassificationMetrics tentang performa model.
Menampilkan metrik untuk validasi model
Gunakan kode berikut untuk menampilkan metrik:
Console.WriteLine();
Console.WriteLine("Model quality metrics evaluation");
Console.WriteLine("--------------------------------");
Console.WriteLine($"Accuracy: {metrics.Accuracy:P2}");
Console.WriteLine($"Auc: {metrics.AreaUnderRocCurve:P2}");
Console.WriteLine($"F1Score: {metrics.F1Score:P2}");
Console.WriteLine("=============== End of model evaluation ===============");
Accuracy
Metrik mendapatkan akurasi model, yang merupakan proporsi prediksi yang benar dalam set pengujian.AreaUnderRocCurve
Metrik menunjukkan seberapa yakin model mengklasifikasikan kelas positif dan negatif dengan benar. Anda inginAreaUnderRocCurve
sedekat mungkin dengan satu.F1Score
Metrik mendapatkan skor F1 model, yang merupakan ukuran keseimbangan antara presisi dan pengenalan. Anda inginF1Score
sedekat mungkin dengan satu.
Memprediksi hasil data pengujian
UseModelWithSingleItem()
Buat metode , tepat setelahEvaluate()
metode , menggunakan kode berikut:void UseModelWithSingleItem(MLContext mlContext, ITransformer model) { }
Metode menjalankan
UseModelWithSingleItem()
tugas-tugas berikut:- Membuat satu komentar data pengujian.
- Memprediksi sentimen berdasarkan data pengujian.
- Menggabungkan data pengujian dan prediksi untuk pelaporan.
- Menampilkan hasil yang diprediksi.
Tambahkan panggilan ke metode baru tepat di bawah
Evaluate()
panggilan metode menggunakan kode berikut:UseModelWithSingleItem(mlContext, model);
Tambahkan kode berikut untuk dibuat sebagai baris pertama dalam
UseModelWithSingleItem()
Metode:PredictionEngine<SentimentData, SentimentPrediction> predictionFunction = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);
PredictionEngine adalah API kenyamanan, yang memungkinkan Anda melakukan prediksi pada satu instans data.
PredictionEngine
tidak aman untuk utas. Dapat digunakan di lingkungan rangkaian tunggal atau prototipe. Untuk meningkatkan performa dan keamanan utas di lingkungan produksi, gunakanPredictionEnginePool
layanan , yang menciptakanObjectPool
PredictionEngine
objek untuk digunakan di seluruh aplikasi Anda. Lihat panduan ini tentang cara menggunakanPredictionEnginePool
dalam ASP.NET Core Web API.Catatan
PredictionEnginePool
ekstensi layanan saat ini dalam pratinjau.Tambahkan komentar untuk menguji prediksi model terlatih dalam
UseModelWithSingleItem()
metode dengan membuat instansSentimentData
:SentimentData sampleStatement = new SentimentData { SentimentText = "This was a very bad steak" };
Teruskan data komentar pengujian ke
PredictionEngine
dengan menambahkan yang berikut ini sebagai baris kode berikutnya dalamUseModelWithSingleItem()
metode :var resultPrediction = predictionFunction.Predict(sampleStatement);
Fungsi Predict() membuat prediksi pada satu baris data.
Tampilkan
SentimentText
dan prediksi sentimen yang sesuai menggunakan kode berikut:Console.WriteLine(); Console.WriteLine("=============== Prediction Test of model with a single sample and test dataset ==============="); Console.WriteLine(); Console.WriteLine($"Sentiment: {resultPrediction.SentimentText} | Prediction: {(Convert.ToBoolean(resultPrediction.Prediction) ? "Positive" : "Negative")} | Probability: {resultPrediction.Probability} "); Console.WriteLine("=============== End of Predictions ==============="); Console.WriteLine();
Menggunakan model untuk prediksi
Menyebarkan dan memprediksi item batch
UseModelWithBatchItems()
Buat metode , tepat setelahUseModelWithSingleItem()
metode , menggunakan kode berikut:void UseModelWithBatchItems(MLContext mlContext, ITransformer model) { }
Metode menjalankan
UseModelWithBatchItems()
tugas-tugas berikut:- Membuat data pengujian batch.
- Memprediksi sentimen berdasarkan data pengujian.
- Menggabungkan data pengujian dan prediksi untuk pelaporan.
- Menampilkan hasil yang diprediksi.
Tambahkan panggilan ke metode baru tepat di bawah
UseModelWithSingleItem()
panggilan metode menggunakan kode berikut:UseModelWithBatchItems(mlContext, model);
Tambahkan beberapa komentar untuk menguji prediksi model terlatih dalam
UseModelWithBatchItems()
metode :IEnumerable<SentimentData> sentiments = new[] { new SentimentData { SentimentText = "This was a horrible meal" }, new SentimentData { SentimentText = "I love this spaghetti." } };
Memprediksi sentimen komentar
Gunakan model untuk memprediksi sentimen data komentar menggunakan metode Transform():
IDataView batchComments = mlContext.Data.LoadFromEnumerable(sentiments);
IDataView predictions = model.Transform(batchComments);
// Use model to predict whether comment data is Positive (1) or Negative (0).
IEnumerable<SentimentPrediction> predictedResults = mlContext.Data.CreateEnumerable<SentimentPrediction>(predictions, reuseRowObject: false);
Menggabungkan dan menampilkan prediksi
Buat header untuk prediksi menggunakan kode berikut:
Console.WriteLine();
Console.WriteLine("=============== Prediction Test of loaded model with multiple samples ===============");
Karena SentimentPrediction
diwarisi dari SentimentData
, metode yang Transform()
diisi SentimentText
dengan bidang yang diprediksi. Saat proses ML.NET, setiap komponen menambahkan kolom, dan ini memudahkan untuk menampilkan hasilnya:
foreach (SentimentPrediction prediction in predictedResults)
{
Console.WriteLine($"Sentiment: {prediction.SentimentText} | Prediction: {(Convert.ToBoolean(prediction.Prediction) ? "Positive" : "Negative")} | Probability: {prediction.Probability} ");
}
Console.WriteLine("=============== End of predictions ===============");
Hasil
Hasil Anda harus mirip dengan yang berikut ini. Selama pemrosesan, pesan ditampilkan. Anda mungkin melihat peringatan, atau memproses pesan. Ini telah dihapus dari hasil berikut untuk kejelasan.
Model quality metrics evaluation
--------------------------------
Accuracy: 83.96%
Auc: 90.51%
F1Score: 84.04%
=============== End of model evaluation ===============
=============== Prediction Test of model with a single sample and test dataset ===============
Sentiment: This was a very bad steak | Prediction: Negative | Probability: 0.1027377
=============== End of Predictions ===============
=============== Prediction Test of loaded model with a multiple samples ===============
Sentiment: This was a horrible meal | Prediction: Negative | Probability: 0.1369192
Sentiment: I love this spaghetti. | Prediction: Positive | Probability: 0.9960636
=============== End of predictions ===============
=============== End of process ===============
Press any key to continue . . .
Selamat! Anda sekarang telah berhasil membangun model pembelajaran mesin untuk mengklasifikasikan dan memprediksi sentimen pesan.
Membangun model yang sukses adalah proses berulang. Model ini memiliki kualitas awal yang lebih rendah karena tutorial menggunakan himpunan data kecil untuk memberikan pelatihan model cepat. Jika Anda tidak puas dengan kualitas model, Anda dapat mencoba meningkatkannya dengan menyediakan himpunan data pelatihan yang lebih besar atau dengan memilih algoritma pelatihan yang berbeda dengan parameter hiper yang berbeda untuk setiap algoritma.
Anda dapat menemukan kode sumber untuk tutorial ini di repositori dotnet/samples .
Langkah berikutnya
Di tutorial ini, Anda akan mempelajari cara:
- Membuat aplikasi konsol
- Siapkan data
- Muat data
- Membangun dan melatih model
- Mengevaluasi model
- Menggunakan model untuk membuat prediksi
- Lihat hasilnya
Lanjutkan ke tutorial berikutnya untuk mempelajari lebih lanjut