Yükleniyor

Kendi yapay zekanızı yazın .Net ile metinden duygu analizi nasıl yapılır?

Blog Kategorileri

.Net Core Mimariler
Tasarım Desenleri
ORM Araçları
API Geliştirme
Web Geliştirme
Veritabanları
7 Şubat 2026 Cumartesi
Kendi yapay zekanızı yazın .Net ile metinden duygu analizi nasıl yapılır?

Merhaba,

Günümüzde kullanıcı yorumları, işletmeler ve ürün sahipleri için değerli bir bilgi kaynağı haline geldi. Ancak binlerce yorumu manuel olarak incelemek zaman alıcı bir süreç olabilir. İşte burada makine öğrenmesi devreye giriyor: Metin tabanlı verileri otomatik olarak analiz ederek, yorumların olumlu, olumsuz veya nötr olduğunu hızlıca sınıflandırabiliyoruz. Bu yazıda, ML.NET kullanarak bir Web API üzerinden metinlerdeki duygu durumunu tespit eden basit bir model geliştireceğiz ve adım adım nasıl çalıştığını göstereceğim.

ML.NET Nedir

ML.NET, .NET geliştiricileri için tasarlanmış açık kaynaklı ve platformlar arası bir makine öğrenmesi çerçevesidir. Bu araç sayesinde veri hazırlama, model eğitimi ve tahminleme süreçlerinin tamamı doğrudan C# veya F# kullanılarak .NET ekosistemi içerisinde gerçekleştirilebilir. Harici bir dil veya çalışma ortamına ihtiyaç duymadan, makine öğrenmesi modellerini mevcut uygulamalara entegre etme imkanı tanır.

Neden Makine Öğrenmesi?

Bir e-ticaret sitesinde kullanıcı yorumlarını düşünün. Yorumları elle sınıflandırmak hem zaman alır hem de ölçeklenemez. Makine öğrenmesi (ML) sayesinde modelimizi eğitip, yeni yorumları otomatik olarak olumlu, olumsuz veya nötr şeklinde sınıflandırabiliriz.

Problem Tanımı ve Veri Seti

Bu proje için elimizde küçük bir CSV dosyası bulunuyor. Dosya, iki sütundan oluşuyor: Text ve Label.

  1. Text: Kullanıcının yaptığı yorum

  2. Label: Yorumun duygu sınıfı (olumlu, olumsuz veya nötr)

Örnek veri seti şu şekilde görünüyor:

"Bu ürünü çok sevdim",olumlu
"Gerçekten harika",olumlu
"Beklentilerimin üzerindeydi",olumlu
"Gayet başarılı bir ürün",olumlu
"İşimi fazlasıyla gördü",olumlu
"Memnun kaldım",olumlu
"Parasını hak ediyor",olumlu
"Kalitesi beklediğimden iyiydi",olumlu
"Tekrar alırım",olumlu
"Oldukça tatmin edici",olumlu

"Berbat bir deneyimdi",olumsuz
"Hiç memnun kalmadım",olumsuz
"Tam bir hayal kırıklığı",olumsuz
"Beklentilerimi karşılamadı",olumsuz
"Bir daha almam",olumsuz
"Kalitesi çok kötü",olumsuz
"Zaman kaybıydı",olumsuz
"Parama yazık oldu",olumsuz
"Hiç beğenmedim",olumsuz
"Sorunluydu",olumsuz

"Fena değil",nötr
"Ne iyi ne kötü",nötr
"İdare eder",nötr
"Ortalama bir ürün",nötr
"Beklediğim gibiydi",nötr
"Normaldi",nötr
"Çok bir fark yaratmadı",nötr
"İş görür",nötr
"Kararsızım",nötr
"Standart bir deneyimdi",nötr

Bu veri seti, modelimizi eğitirken temel olarak yorumların hangi duyguya ait olduğunu öğrenmesini sağlayacak.

Not: Bu veri seti oldukça küçük ve deneme amaçlıdır. Modelimizi eğitmek ve temel kavramları göstermek için yeterli; ancak gerçek dünyada yüksek doğruluk ve güvenilirlik için çok daha fazla ve çeşitli veriye ihtiyaç olabilir

ML.NET ile Model Sınıfları

Modelimizi oluştururken, verimizin girdi ve çıktı kısımlarını temsil edecek iki sınıfa ihtiyacımız var. Bu sınıflar, ML.NET’in veri yükleme ve işleme süreçlerinde kullanılıyor.

Öncelikle girdi ve çıktıyı temsil eden sınıfımız:

public class SentimentData
{
    [LoadColumn(0)]
    public string Text { get; set; }

    [LoadColumn(1)]
    public string Label { get; set; }
}
  1. Text: Kullanıcının yorumunu temsil eder. Bu modelin girdisi olacak.

  2. Label: Yorumun duygu sınıfını temsil eder (olumlu, olumsuz veya nötr). Bu modelin çıkışı olacak.

LoadColumn, CSV dosyamızdaki sütunların sırasını belirtir. 0 ilk sütun (Text), 1 ise ikinci sütun (Label) anlamına gelir.

Tahmin Sonuçlarını Temsil Eden Sınıf

Modelimizi eğittikten sonra yeni yorumlar için tahminler yapacağız. Bu tahminlerin çıktısını almak için bir sınıf tanımlıyoruz:

public class SentimentPrediction
{
    [ColumnName("PredictedLabel")]
    public string Prediction { get; set; }
}
  1. Prediction: Modelin yorumun hangi duygu sınıfına ait olduğunu tahmin ettiği alan.

  2. [ColumnName("PredictedLabel")]: ML.NET tarafından üretilen tahmin sütununu Prediction özelliğine bağlar.

Yani, eğitim tamamlandıktan sonra modelimize bir yorum verdiğimizde, bu sınıf aracılığıyla tahmini olumlu, olumsuz veya nötr olarak alabiliriz.

Model Eğitimi ve Tahmin Yapma

Modelimizi uygulama başlatıldığında eğitiyoruz ve tahminleri yapmak için bir singleton PredictionEngine kullanıyoruz. Bu sayede her yeni yorum için model tekrar tekrar yüklenmek zorunda kalmıyor; performans artıyor.

Örneğin SentimentService sınıfımız şöyle çalışıyor:

using Microsoft.ML;
using MLSentimentAPI.Models;

namespace MLSentimentAPI.Services
{
    public class SentimentService
    {
        private readonly MLContext _mlContext;
        private readonly PredictionEngine<SentimentData, SentimentPrediction> _predictionEngine;
        public SentimentService()
        {
            _mlContext = new MLContext();

            var data = _mlContext.Data.LoadFromTextFile<SentimentData>(path: "Datas/sentiment_data.csv", hasHeader: true, separatorChar: ',');
            var pipeline = _mlContext.Transforms.Conversion.MapValueToKey(
                outputColumnName: "Label",
                inputColumnName: nameof(SentimentData.Label))

            .Append(_mlContext.Transforms.Text.FeaturizeText(
                outputColumnName: "Features",
                inputColumnName: nameof(SentimentData.Text)))

            .Append(_mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy(
                labelColumnName: "Label",
                featureColumnName: "Features"))

            .Append(_mlContext.Transforms.Conversion.MapKeyToValue(
                outputColumnName: "PredictedLabel",
                inputColumnName: "PredictedLabel"));

            var model = pipeline.Fit(data);

            _predictionEngine = _mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);
        }

        public string Predict(string text)
        {
            var input = new SentimentData { Text = text };
            var result = _predictionEngine.Predict(input);
            return result.Prediction;
        }

    }
}

Bu kodda, önce MLContext ile ML.NET ortamımızı oluşturuyoruz ve CSV dosyamızdan verileri SentimentData sınıfına yüklüyoruz. Daha sonra pipeline ile etiketler sayısal değerlere çevriliyor, kullanıcı yorumları sayısal özellik vektörüne dönüştürülüyor ve SdcaMaximumEntropy algoritmasıyla çok sınıflı sınıflandırma yapılıyor. Son olarak modelin tahmin ettiği sayısal değerler tekrar okunabilir etiketlere çevriliyor ve eğitim tamamlanıyor. PredictionEngine sayesinde tek bir örnek üzerinden tahmin yapabiliyoruz; Predict metodu, kullanıcıdan gelen yorumu alıyor ve modeli kullanarak tahmin sonucunu olumlu, olumsuz veya nötr olarak döndürüyor.

Not olarak belirtmek gerekir ki, PredictionEngine thread-safe değildir. Bu nedenle yüksek trafikli bir Web API’de tek bir instance ile kullanmak riskli olabilir. Küçük ve deneme amaçlı projelerde sorun yaşanmayabilir; gerçek üretim senaryolarında ise PredictionEnginePool kullanmak, birden fazla thread’in güvenle tahmin yapmasını ve performansın korunmasını sağlayabilir.

Web API ile ML’i Açmak

Artık eğittiğimiz modeli dış dünyaya açabiliriz. Bunun için bir Web API controller oluşturuyoruz. SentimentController ile kullanıcıdan gelen yorumları alıyor ve SentimentService aracılığıyla tahmin yapıyoruz:

using Microsoft.AspNetCore.Mvc;
using MLSentimentAPI.Services;

[ApiController]
[Route("api/[controller]")]
public class SentimentController : ControllerBase
{
    private readonly SentimentService _sentimentService;

    public SentimentController(SentimentService sentimentService)
    {
        _sentimentService = sentimentService;
    }

    [HttpPost("predict")]
    public IActionResult Predict([FromBody] SentimentRequest request)
    {
        var prediction = _sentimentService.Predict(request.Text);

        return Ok(new
        {
            sonuc = prediction
        });
    }
}

public class SentimentRequest
{
    public string Text { get; set; }
}

Burada Predict endpoint’i bir POST isteği olarak tasarlandı ve body’den bir SentimentRequest nesnesi alıyor. Kullanıcının girdiği metin SentimentService tarafından işleniyor ve modelin tahmini olumlu, olumsuz veya nötr olarak JSON formatında döndürülüyor

{
  "text": "Bu ürünü çok sevdim"
}

API, SentimentService aracılığıyla tahmini gerçekleştiriyor ve sonucu JSON olarak geri döndürüyor:

{
  "sonuc": "olumlu"
}

Böylece modelimiz artık bir Web API üzerinden erişilebilir hâle geldi ve diğer uygulamalar veya istemciler tarafından kullanılabilir. Bu yapı, ML.NET ile eğitilen modelleri gerçek dünya senaryolarına entegre etmenin basit ve etkili bir yoludur.

Projeden Öğrenilenler ve Sonuç

ML.NET ile geliştirdiğimiz bu Web API sayesinde kullanıcı yorumlarını otomatik olarak olumlu, olumsuz veya nötr olarak sınıflandırabiliyoruz. Küçük veri setiyle temel bir model oluşturduk ve bunu bir Web API üzerinden erişilebilir hâle getirdik. Bu yöntem, yorumları hızlı şekilde analiz etmeyi, uygulamalara kolayca entegre etmeyi ve ölçeklenebilir tahminler yapmayı mümkün kılıyor. Tabii dürüst olayım: bu model production-ready değil. Küçük veri seti ve basit pipeline ile sınırlı doğruluk elde ediliyor. Gerçek projelerde daha büyük ve çeşitli veri setleriyle modelin doğruluğu artırılabilir.

Github: https://github.com/Sinantosun/MLSentimentAPI

Diğer Bloglarda Görüşmek Üzere 👋