Bagikan melalui


Tutorial: Menganalisis sentimen komentar situs web dengan klasifikasi biner di ML.NET

Tutorial ini menunjukkan kepada Anda cara membuat aplikasi konsol .NET 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 belajar cara:

  • Membuat aplikasi konsol
  • Siapkan data
  • Muatkan data
  • Membangun dan melatih model
  • Evaluasilah 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 8 sebagai kerangka kerja yang akan digunakan. Klik tombol Buat.

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

  4. Instal Paket Microsoft.ML NuGet:

    Nota

    Sampel ini menggunakan versi stabil terbaru dari paket NuGet yang disebutkan kecuali dinyatakan lain.

    Di Penjelajah Solusi, klik kanan pada 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 Instal. Lanjutkan dengan penginstalan dengan menyetujui persyaratan lisensi untuk paket yang Anda pilih.

Menyiapkan data Anda

Nota

Himpunan data untuk tutorial ini berasal dari 'Dari Grup ke Label Individu 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: Universitas California, Sekolah Tinggi Informasi dan Ilmu Komputer.

  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_labelled.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 arahan 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 arahan, 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, lalu pilih Tambahkan>Item Baru.

    • Dalam kotak dialog Tambahkan Item Baru , pilih Kelas dan ubah bidang Nama menjadi SentimentData.cs. Kemudian, pilih Tambahkan.

  4. File SentimentData.cs terbuka di editor kode. Tambahkan arahan 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 bool nilai (Sentiment) 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 sedikit lambat dalam pelayanan. 0
Kerak tidak baik. 0
Wow... Menyukai 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.

Muatkan 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, hingga DBContext di Entity Framework.

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 ini LoadData() menjalankan 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. Mengambil 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 menjadi 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. Kembalikan splitDataView pada akhir metode LoadData().

    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 ini BuildAndTrainModel() menjalankan 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 Features
    Pelayan sedikit lambat dalam pelayanan. 0 [0.76, 0.65, 0.44, …]
    Kerak tidak baik. 0 [0.98, 0.43, 0.54, …]
    Wow... Menyukai 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 input yang difeaturisasi SentimentText (Features) serta Label untuk mempelajari dari data historis.

Melatih 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;

Evaluasilah 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 ini Evaluate() menjalankan 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 panggilan BuildAndTrainModel 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 Labels dalam himpunan 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 yang satu.

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

Memprediksi hasil data pengujian

  1. Buat metode UseModelWithSingleItem() tepat setelah metode Evaluate() dengan menggunakan kode berikut:

    void UseModelWithSingleItem(MLContext mlContext, ITransformer model)
    {
    
    }
    

    Metode ini UseModelWithSingleItem() menjalankan 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 pemanggilan metode yang baru tepat di bawah pemanggilan metode Evaluate() 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 diterima untuk digunakan di lingkungan utas tunggal atau prototipe. Untuk peningkatan 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 di ASP.NET Core Web API.

    Nota

    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 terkait 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. Buat metode UseModelWithBatchItems() tepat setelah metode UseModelWithSingleItem() dengan menggunakan kode berikut:

    void UseModelWithBatchItems(MLContext mlContext, ITransformer model)
    {
    
    }
    

    Metode ini UseModelWithBatchItems() menjalankan 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 pemanggilan metode yang baru tepat di bawah pemanggilan metode UseModelWithSingleItem() 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 Transform() mengisi SentimentText dengan bidang yang diprediksi. Saat proses 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 ===============");

Results

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 berhasil 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 selanjutnya

Dalam tutorial ini, Anda belajar cara:

  • Membuat aplikasi konsol
  • Siapkan data
  • Muatkan data
  • Membangun dan melatih model
  • Evaluasilah model
  • Menggunakan model untuk membuat prediksi
  • Lihat hasilnya

Lanjutkan ke tutorial berikutnya untuk mempelajari lebih lanjut