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

  1. Buat Aplikasi Konsol C# yang disebut "SentimentAnalysis". Klik tombol Berikutnya.

  2. Pilih .NET 6 sebagai kerangka kerja yang akan digunakan. Klik tombol Buat.

  3. Buat direktori bernama Data dalam proyek Anda untuk menyimpan file himpunan data Anda.

  4. 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.

  1. Unduh file ZIP himpunan data Kalimat Berlabel Sentimen UCI, dan unzip.

  2. yelp_labelled.txt Salin file ke direktori Data yang Anda buat.

  3. 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

  1. 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;
    
  2. 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");
    
  3. 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 .

  4. File SentimentData.cs terbuka di editor kode. Tambahkan pernyataan berikut using ke bagian atas SentimentData.cs:

    using Microsoft.ML.Data;
    
  5. Hapus definisi kelas yang ada dan tambahkan kode berikut, yang memiliki dua kelas SentimentData dan SentimentPrediction, 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 boolSentiment() 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 SentimentTextbaru .

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:

  1. Console.WriteLine("Hello World!") Ganti baris dengan kode berikut untuk mendeklarasikan dan menginisialisasi variabel mlContext:

    MLContext mlContext = new MLContext();
    
  2. Tambahkan yang berikut ini sebagai baris kode berikutnya:

    TrainTestData splitDataView = LoadData(mlContext);
    
  3. Buat LoadData() metode di bagian Program.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.
  4. 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.

  1. 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 testFractionparameter . Defaultnya adalah 10%, dalam hal ini Anda menggunakan 20% untuk mengevaluasi lebih banyak data.

  2. Mengembalikan di splitDataView akhir LoadData() metode:

    return splitDataView;
    

Membangun dan melatih model

  1. Tambahkan panggilan berikut ke metode di BuildAndTrainModelbawah panggilan ke LoadData 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.
  2. BuildAndTrainModel() Buat metode , di bawah LoadData() metode , menggunakan kode berikut:

    ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet)
    {
    
    }
    

Mengekstrak dan mengubah data

  1. 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 jenis Features 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.

  1. Evaluate() Buat metode , tepat setelah BuildAndTrainModel(), 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.
  2. Tambahkan panggilan ke metode baru di bawah BuildAndTrainModel panggilan metode menggunakan kode berikut:

    Evaluate(mlContext, model, splitDataView.TestSet);
    
  3. splitTestSet Ubah data dengan menambahkan kode berikut ke Evaluate():

    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.

  4. 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 ingin AreaUnderRocCurve sedekat mungkin dengan satu.

  • F1Score Metrik mendapatkan skor F1 model, yang merupakan ukuran keseimbangan antara presisi dan pengenalan. Anda ingin F1Score sedekat mungkin dengan satu.

Memprediksi hasil data pengujian

  1. UseModelWithSingleItem() Buat metode , tepat setelah Evaluate() 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.
  2. Tambahkan panggilan ke metode baru tepat di bawah Evaluate() panggilan metode menggunakan kode berikut:

    UseModelWithSingleItem(mlContext, model);
    
  3. 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, gunakan PredictionEnginePool layanan , yang menciptakan ObjectPoolPredictionEngine objek untuk digunakan di seluruh aplikasi Anda. Lihat panduan ini tentang cara menggunakan PredictionEnginePool dalam ASP.NET Core Web API.

    Catatan

    PredictionEnginePool ekstensi layanan saat ini dalam pratinjau.

  4. Tambahkan komentar untuk menguji prediksi model terlatih dalam UseModelWithSingleItem() metode dengan membuat instans SentimentData:

    SentimentData sampleStatement = new SentimentData
    {
        SentimentText = "This was a very bad steak"
    };
    
  5. Teruskan data komentar pengujian ke PredictionEngine dengan menambahkan yang berikut ini sebagai baris kode berikutnya dalam UseModelWithSingleItem() metode :

    var resultPrediction = predictionFunction.Predict(sampleStatement);
    

    Fungsi Predict() membuat prediksi pada satu baris data.

  6. 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

  1. UseModelWithBatchItems() Buat metode , tepat setelah UseModelWithSingleItem() 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.
  2. Tambahkan panggilan ke metode baru tepat di bawah UseModelWithSingleItem() panggilan metode menggunakan kode berikut:

    UseModelWithBatchItems(mlContext, model);
    
  3. 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