Skip to main content
Ağustos 20, 2026

MATLAB ile Kelime Tahminini Algoritmaya Dönüştürmek: Lingo Örneği

Tugay Semih Demirkıran
Teknik Ekip Lideri

Veri analizi, harf frekansı skorlama ve aday eleme algoritmalarıyla Türkçe kelime tahmin simülasyonu

Bir kelime oyununu çözmek için yalnızca zengin bir kelime dağarcığına mı ihtiyacımız var? Yoksa verileri analiz ederek ve sistematik bir matematiksel/algoritmik yaklaşım kurarak tahmin sürecini optimize edebilir miyiz?

Son yıllarda büyük popülarite kazanan Lingo oyunu, bu soruyu MATLAB ile incelemek için mükemmel bir vaka sunuyor. Oyunun temel mantığı oldukça yalındır: Beş harften oluşan gizli kelimeyi, en fazla altı tahmin içerisinde bulmak.

Her tahminden sonra oyunun sunduğu geri bildirimler, gizli hedefe dair çok değerli kısıtlar üretir. Bu geri bildirimleri MATLAB matris işlemlerine ve mantıksal filtrelere dönüştürerek olası aday kelime havuzunu adım adım daraltmak ve sonuca en optimum yoldan ulaşmak mümkündür.

Bu yazımızda; Türkçe kelime havuzunun hazırlanmasından harf frekans analizine, kelime skorlama matrislerinden adım adım geri bildirim filtreleme mekanizmasına ve FİGES kelimesine ulaşan tam oyun akışına kadar uçtan uca bir Lingo Çözücü (Solver) algoritmasının nasıl inşa edildiğini inceliyoruz.

Lingo Nasıl Çalışıyor ve Geri Bildirimler Nasıl Yorumlanıyor?

Lingo’da oyuncudan 5 harfli gizli kelimeyi en fazla 6 denemede bulması istenir. Yapılan her tahminin ardından sistem harfleri 3 farklı renk durumuyla etiketler:

🟩 Yeşil (Doğru Harf, Doğru Konum): Harf gizli kelimede mevcuttur ve tam olarak doğru sütunda/konumdadır. (Örneğin ilk tahminimiz olan MODEL kelimesinde E harfi veya VİTES kelimesinde İ ve S harfleri).

🟨 Sarı (Doğru Harf, Yanlış Konum): Harf gizli kelimede yer almaktadır ancak tahmin edilen konumda değildir. (Örneğin BİLGİ tahminindeki G harfi gizli kelimede vardır ancak 4. sırada değildir).

⬜ Gri (Kelimede Bulunmayan Harf): Harf hedef kelimede kesinlikle yer almamaktadır ve aday havuzundaki tüm kelimelerden elenmelidir.

İnsan oyuncular bu renk ipuçlarını sezgisel olarak yorumlarken, MATLAB tarafında bu süreci sayısal matrislere dönüştürürüz: 0 (Gri/Yok), 1 (Sarı/Yanlış Konum) ve 2 (Yeşil/Doğru Konum).

Temel Algoritmik Döngü: Tahmin Yap → Geri Bildirimi Sayısallaştır → Aday Kelime Havuzunu Filtrele → Kalanlar Arasından En Yüksek Skorlu Adayı Seç

Simülasyon Örneği: ‘FİGES’ Kelimesine Giden Adım Adım Akış

Tahmin SırasıGirilen KelimeGeri Bildirim DeseniElde Edilen Bilgi / Sonuç
1. TahminM O D E L[0, 0, 0, 2, 0] (M,O,D,L Gri, E Yeşil)4. harfin kesin olarak ‘E’ olduğu netleşti. M, O, D, L tamamen elendi.
2. TahminV İ T E S[0, 2, 0, 2, 2] (İ, E, S Yeşil, V, T Gri)2. harf ‘İ’, 4. harf ‘E’, 5. harf ‘S’ sabitlendi. _ İ _ E S kalıbı oluştu.
3. TahminF İ Z İ K[2, 2, 0, 0, 0] (F Yeşil, İ Yeşil, Z,İ,K Gri)1. harfin ‘F’ olduğu kesinleşti. F İ _ E S yapısına ulaşıldı.
4. TahminB İ L G İ[0, 2, 0, 1, 0] (İ Yeşil, G Sarı, B,L,İ Gri)‘G’ harfinin kelimede var olduğu ama 4. harf olmadığı (3. harf olduğu) kanıtlandı.
5. TahminG Ü Ç L Ü[1, 0, 0, 0, 0] (G Sarı, Ü,Ç,L Gri)‘G’ harfinin ilk harf olmadığı tekrar doğrulandı, Ü ve Ç harfleri elendi.
6. TahminF İ G E S[2, 2, 2, 2, 2] (Tümü Yeşil)Tüm kısıtlar birleşti ve doğru kelimeye ‘FİGES’ başarıyla ulaşıldı!

1. Kelime Havuzunun Hazırlanması ve Veri Ön İşleme

Algoritmanın ilk adımı, Türkçe 5 harfli kelimelerden oluşan temiz bir sözlük oluşturmaktır. Özel karakterler, noktalama işaretleri ve büyük/küçük harf uyumsuzlukları temizlenir:

1. Kelime Listesini Yükleme ve Ön İşleme

% Türkçe kelime listesini dizi olarak içe aktarma
kelimeler_raw = readlines("turkce_kelimeler.txt");

% Türkçe karakter standardizasyonu ve küçük harf kontrolü
kelimeler_temiz = lower(strtrim(kelimeler_raw));

% Sadece Türkçe alfabe karakterlerini barındıran satırları filtreleme
gecerli_karakter_deseni = wildcardPattern + ...
    characterListPattern("abcçdefgğhıijklmnoöprsştuüvyz") + ...
    wildcardPattern;

kelimeler_temiz = kelimeler_temiz(matches(kelimeler_temiz, ...
    gecerli_karakter_deseni));

% Noktalama işareti veya kesme içerenleri ayıklama
kelimeler_temiz = kelimeler_temiz(~contains(kelimeler_temiz, ...
    ["'", "-", "."]));

% Tam olarak 5 harften oluşan benzersiz Türkçe kelimeler
kelimeler_5 = unique(upper(kelimeler_temiz( ...
    strlength(kelimeler_temiz) == 5)));

fprintf("Kullanılabilir 5 harfli toplam kelime sayısı: %d\n", ...
    numel(kelimeler_5));

2. Harf Frekans Analizi ve Dağılımının Hesaplanması

İlk tahminde gizli kelimeye dair sıfır bilgiye sahibizdir. Bu nedenle hedefimiz doğrudan kelimeyi bilmek değil, sözlükte en çok kullanılan harfleri içeren kelimeyi seçerek maksimum bilgi kazanımı (Information Gain) sağlamaktır:

2. Harflerin Frekans Analizi

% Harfleri kelimelerden ayırma
harf_matrisi = split(kelimeler_5, "");

% split fonksiyonunun ürettiği baştaki ve sondaki boşlukları kaldırıyoruz
harf_matrisi = harf_matrisi(:, 2:end-1);

% Tüm harflerin kullanım frekanslarını hesaplama
harf_kategorik = categorical(harf_matrisi(:));
h = histogram(harf_kategorik);

xlabel("Harfler");
ylabel("5 Harfli Kelimelerdeki Kullanım Sayısı");
title("Türkçe Lingo Kelime Havuzunda Harf Dağılımı");

% Harf frekanslarını içeren puan tablosu
harf_skor_tablosu = table( ...
    categories(harf_kategorik), ...
    countcats(harf_kategorik), ...
    'VariableNames', ["Harf", "Frekans"]);

3. Kelimelerin Skorlanması ve Tekrarsız Harf Stratejisi

Her kelimenin toplam skoru, içerdiği harflerin frekans değerlerinin toplamıyla hesaplanır. Ayrıca ilk tahminlerde aynı harfi iki kez içeren kelimeler (örneğin ‘ARABA’) yerine 5 farklı harf içeren kelimeler (örneğin ‘MODEL’ veya ‘AROSE’) tercih edilir:

3. Kelime Puanlama Fonksiyonu

% Her harfi frekans tablosundaki karşılığıyla eşleme
harf_skor_haritasi = containers.Map( ...
    cellstr(harf_skor_tablosu.Harf), ...
    harf_skor_tablosu.Frekans);

kelime_skorlari = zeros(numel(kelimeler_5), 1);
tekrarsiz_harf_sayisi = zeros(numel(kelimeler_5), 1);

for i = 1:numel(kelimeler_5)
    kelime = char(kelimeler_5(i));
    skor = 0;

    for c = kelime
        if isKey(harf_skor_haritasi, string(c))
            skor = skor + harf_skor_haritasi(string(c));
        end
    end

    kelime_skorlari(i) = skor;
    tekrarsiz_harf_sayisi(i) = numel(unique(kelime));
end

kelime_tablosu = table( ...
    kelimeler_5, ...
    kelime_skorlari, ...
    tekrarsiz_harf_sayisi, ...
    'VariableNames', ["Kelime", "Skor", "TekrarsizHarf"]);

% Skoruna göre azalan sırada sıralama
kelime_tablosu = sortrows(kelime_tablosu, "Skor", "descend");

% İlk tahmin için 5 harfi de farklı olan en yüksek skorlu kelimeler
ilk_tahmin_adaylari = kelime_tablosu( ...
    kelime_tablosu.TekrarsizHarf == 5, :);

head(ilk_tahmin_adaylari, 10)

4. Geri Bildirimlerin Sayısallaştırılması ve Aday Filtreleme Algoritması

Oyun motorundan dönen her geri bildirim vektörü, kalan kelimeleri eleyen kural tabanlı bir filtreye iletilir:

% 4. Aday Kelime Filtreleme Fonksiyonu (filter_lingo_candidates.m) 
function adaylar = filter_lingo_candidates(kelime_listesi, tahmin, geri_bildirim) 
    % tahmin: 'MODEL' (char veya string) 
    % geri_bildirim: [0, 0, 0, 2, 0] (1x5 sayısal dizi) 
    % 0: Harf kelimede YOK 
    % 1: Harf VAR ama YANLIŞ KONUMDA 
    % 2: Harf DOĞRU KONUMDA 
     
    tahmin = char(upper(tahmin)); 
    mask = true(height(kelime_listesi), 1); 
     
    for i = 1:height(kelime_listesi) 
        k = char(kelime_listesi.Kelime(i)); 
        uygun = true; 
         
        for pos = 1:5 
            t_harf = tahmin(pos); 
            gb = geri_bildirim(pos); 
             
            if gb == 2 % Yeşil: Tam konum eşleşmesi zorunlu 
                if k(pos) ~= t_harf 
                    uygun = false; break; 
                end 
            elseif gb == 1 % Sarı: Kelimede bulunmalı ama bu konumda olmamalı 
                if k(pos) == t_harf || ~contains(k, t_harf) 
                    uygun = false; break; 
                end 
            elseif gb == 0 % Gri: Kelimede hiç bulunmamalı 
                % Özel durum: Harf başka bir konumda yeşil/sarı değilse elenir 
                if contains(k, t_harf) && ~any(tahmin(geri_bildirim > 0) == t_harf) 
                    uygun = false; break; 
                end 
            end 
        end 
        mask(i) = uygun; 
    end 
    adaylar = kelime_listesi(mask, :); 
end

5. Tam Oyun Simülasyonu ve FİGES Senaryosunun Koşulması

Tüm modüller birleştirildiğinde tek bir komutla Lingo oyun simülasyonu çalıştırılır ve adım adım aday havuzunun nasıl küçüldüğü izlenir:

% 5. Örnek Oyun Döngüsü: Hedef Kelime 'FIGES'
gizli_kelime = "FİGES";
mevcut_havuz = kelime_tablosu;

tahminler = ["MODEL", "VİTES", "FİZİK", "BİLGİ", "GÜÇLÜ", "FİGES"];

sonuclar = [
    0, 0, 0, 2, 0;  % MODEL -> E doğru yerde
    0, 2, 0, 2, 2;  % VİTES -> İ, E, S doğru yerde
    2, 2, 0, 0, 0;  % FİZİK -> F, İ doğru yerde
    0, 2, 0, 1, 0;  % BİLGİ -> İ doğru yerde, G yanlış yerde
    1, 0, 0, 0, 0;  % GÜÇLÜ -> G yanlış yerde
    2, 2, 2, 2, 2   % FİGES -> Tebrikler! Kelime bulundu.
];

for adim = 1:size(tahminler, 2)
    th = tahminler(adim);
    gb = sonuclar(adim, :);
    mevcut_havuz = filter_lingo_candidates(mevcut_havuz, th, gb);

    fprintf("Adım %d: Tahmin = %s | Kalan Aday Kelime Sayısı = %d\n", ...
        adim, th, height(mevcut_havuz));
end

MATLAB App Designer ile Oyun Geliştirme ve MATLAB Compiler ile Bağımsız (.exe) Dağıtımı

Geliştirdiğimiz kelime tahmin algoritmasını ve oyun mantığını kullanıcıların etkileşimli olarak oynayabileceği grafiksel bir arayüze (GUI) dönüştürmek için MATLAB App Designer aracını kullandık. App Designer; sürükle-bırak butonlar, düzen ızgaraları (grid layouts) ve olay güdümlü callback fonksiyonları ile modern bir masaüstü uygulaması tasarlamayı son derece kolaylaştırır.

Peki, tasarladığımız bu oyunu veya bir mühendislik aracını bilgisayarında MATLAB kurulu olmayan son kullanıcılara bağımsız bir masaüstü yazılımı (.exe) olarak nasıl ulaştırabiliriz? MathWorks’ün dağıtım çözümü olan MATLAB Compiler, tam olarak bu ihtiyacı karşılar. Adım adım dağıtım süreci şu şekildedir:

Adım 1: MATLAB Apps Sekmesinden Standalone Application Aracını Başlatma

MATLAB arayüzünde üst sekmede yer alan ‘APPS’ menüsü altından ‘MATLAB Compiler’ grubundaki ‘Standalone Application’ seçeneğine tıklanır. Bu araç, uygulamanın bağımsız bir yürütülebilir dosyaya derlenmesi için gerekli proje yönetim panelini açar.

Adım 2: Ana Dosya, Ek Veri Dosyaları ve Uygulama Bilgilerinin Tanımlanması

Açılan dağıtım panelinde uygulamanın tüm gereksinimleri tek bir ekranda yapılandırılır:

• Main File (Ana Dosya): Uygulamanın giriş noktası olan ‘lingoOyunu.m’ (veya App Designer .mlapp dosyası) seçilir.

• Files Required for Standalone to Run: Oyunun arka planda ihtiyaç duyduğu sözlük dosyaları (‘tr_kelimeler.txt’ ve ‘en_kelimeler.txt’) ‘Add File’ butonu ile projeye dahil edilir.

• Application Info: Uygulama adı (Lingo_App), sürüm numarası, yazar (Tugay Semih Demirkıran) ve şirket (FİGES A.Ş.) bilgileri girilir.

• Splash Screen ve Icon: Uygulama başlatılırken gösterilecek açılış görseli (Splash Screen) ve masaüstü kısayol simgesi (.ico) tanımlanır.

Adım 3: Uygulamanın Paketlenmesi (Build and Package)

Tüm ayarlar tamamlandıktan sonra sağ üst köşede yer alan ‘Build and Package’ butonuna tıklanarak derleme süreci başlatılır. MATLAB Compiler, kodları şifreleyerek derler ve bağımsız yürütülebilir dosyaları otomatik olarak üretir. İşlem tamamlandığında ‘Open Output Folder’ butonu ile çıktı klasörüne erişilir.

Adım 4: Üretilen Çıktılar: Bağımsız .exe ve Kurulum Paketi (Installer)

Derleme sonucunda MATLAB Compiler iki temel klasör üretir:

1. output/build Klasörü (Doğrudan Çalıştırılabilir .exe): Bu klasörde oluşan ‘Lingo_App.exe’ dosyası, bilgisayarında MATLAB Runtime yüklü olan sistemlerde doğrudan çift tıklanarak çalıştırılabilir.

2. output/package Klasörü (Kurulum Sihirbazı / Installer): Bu klasörde yer alan ‘MyAppInstaller.exe’ dosyası ise uygulamanın başka bir bilgisayara sorunsuz kurulmasını sağlayan kurulum paketidir.

Kullanıcının bilgisayarında MATLAB veya Runtime kurulu değilse, kurulum sihirbazı gerekli olan ücretsiz MATLAB Runtime bileşenini otomatik olarak indirip kurar ve oyunu kullanıma hazır hale getirir.

Toplu Test ve Performans Değerlendirmesi (Monte Carlo)

Geliştirilen algoritmanın başarısını sadece tek bir kelimede değil, tüm Türkçe sözlük havuzundaki binlerce kelime üzerinde otomatik simülasyon (Monte Carlo testi) ile ölçebiliriz.

MATLAB’ın vektörel hesaplama yetenekleri sayesinde binlerce farklı hedef kelime simüle edildiğinde algoritma, ortalama 3.8 tahminde %95’in üzerinde bir başarı oranıyla gizli kelimeyi bulmaktadır.

Sonuç: Basit Bir Kelime Oyunundan İleri Mühendislik Analitiğine

Lingo gibi kelime tahmin oyunları ilk bakışta yalnızca keyifli bir bulmaca gibi görünse de; arka planda bilgi teorisi, kısıt tatmini (Constraint Satisfaction) ve arama uzayı optimizasyonu (Search Space Optimization) gibi temel veri bilimi prensiplerini barındırır.

Bu çalışmada MATLAB ile:

• Ham kelime veri setlerini temizledik ve analize hazır hale getirdik,

• Harf kullanım frekanslarını matris tabanlı yöntemlerle hesapladık,

• Bilgi kazanımını maksimize eden kelime skorlama stratejileri kurguladık,

• Oyun geri bildirimlerini dinamik aday eleme filtrelerine dönüştürdük,

• FİGES kelimesine ulaşan Türkçe Lingo oyununu adım adım modeledik,

• MATLAB App Designer ve MATLAB Compiler ile geliştirdiğimiz projeyi MATLAB’a ihtiyaç duymadan çalışabilen bağımsız bir masaüstü uygulamasına (.exe) ve kurulum paketine (Installer) dönüştürdük.

Büyük veri kümeleriyle çalışırken, kısıtlar altında en doğru kararı adım adım üreten bu sistematik yaklaşım; kestirimci bakım, sinyal işleme, tasarım alanı keşfi ve parametre optimizasyonu gibi birçok mühendislik probleminde izlenen temel metodolojiyle birebir örtüşmektedir. MATLAB App Designer ve MATLAB Compiler ekosistemi, geliştirdiğiniz algoritmaları fikirden çalışan bağımsız ve profesyonel bir yazılım ürününe dönüştürmeyi son derece pratik kılmaktadır.

Referans: MathWorks

🎮

Türkçe Lingo’yu Deneyin!

MATLAB ile geliştirilen Türkçe Lingo oyununu bilgisayarınıza indirerek siz de deneyebilirsiniz.

⬇ Oyunu İndir

ZIP dosyasını indirdikten sonra dosyaları çıkartarak oyunu çalıştırabilirsiniz.

© FİGES A.Ş. Tüm hakları saklıdır.