Python ile İngilizce Kelime Öğrenme Oyunu: Bu Sefer Makine Bize Öğretecek !!!

Yiğit Şener
7 min readJan 29, 2022
Photo by Raphael Schaller on Unsplash

Bu yazımda tamamen eski usul kelime ezberleme yöntemi ile Python üzerinde yazdığım bir programdan bahsedeceğim. İnternette yabancı dilde kelime öğrenmek için çok fazla taktik, yöntem, program, içerik bulunuyor. Ne var ki insan kendini tanımalı. Benim zamanım oldukça yazarak ezberleme taraftarıyım. Başka türlü olmuyor. Bence insan önce kendisi için en etkili ve kolay öğrenme yöntemini keşfetmeli. Öğrenme süreci de kıyafet gibidir bir başkasında güzel durabilir, bakıp almak istersiniz ama size uymayabilir.

Yazılımı geliştirirken hem fikrin hayata geçirilmesi hem de teknik olarak nasıl bütünleştirdiğimi sizlere anlatayım.

Problem Statement

İngilizce kaynaklarda çalışma yürütürken gördüğüm kelimeleri hatırlamak için önce not tutmaya başladım. Sonra baktım notlar kayboluyor, unutuluyor en iyisi bir Excel’de Türkçe karşılıkları ile tutayım dedim. Bir yerden sonra yüzlerce kelime birikti. Bu seferde Excel’e yazdığım kelimeyi bir süre sonra (bazen 3 saniye :) ) unutmaya başladım. Hatırlamak için arada Excel’e girip baksam bile benim için çok verimli olmadığını fark ettim. Kendi kendime dedim ki; rastgele kelimeleri karşıma çıkartacak ve Türkçesini-İngilizcesini sorup cevaplara göre doğru-yanlış puanlayacak minik bir oyun yazsam ne güzel olurdu. Dedim olabilir.

Oyunun Algoritması

Basitte olsa bir akışı olan bu test oyunun algoritması aşağıdaki şekildeki gibidir. Birazdan parça parça yazacağımız kodların nereye temas ettiğini bu diyagram üzerinden de takip edebilirsiniz.

Şekil 1: Yazılım Diyagramı

Hadi Kodlayalım

Yazının sonunda veya Github üzerinde tüm kodları inceleyebilirsiniz. Şimdi parça parça kodları yazarak bütüne varmaya çalışalım.

Her şeyden önce malzemelerimizi yazmamız lazım.

Python >= 3.8.7
Pandas >= 1.2.2
xlrd >= 2.0.1 #Daha önce Excel import edenlerde zaten kuruludur.
Bir adet bildiğimiz Excel dosyası
Bir tutam sabır ve merak 2.0.0

Aşağıdaki gibi örnek bir Excel dosyası oluşturalım. Buradaki kolon isimleri kodda yazan ile aynı olmak zorunda. Bu arada Excel’deki kelimeleri her zaman manuel güncelleyeceğiz. Çünkü o kelimeyi araştırırken de biraz öğrenmiş oluyoruz ya da oluyorum. Ama isterseniz Google Translate API’si ile sadece İngilizcesini yazarak Türkçesini otomatik yanına getirebilirsiniz.

Excel’in adı word_list olmalı ve kodu çalıştırdığımız alanla aynı yerde bulunmalı

Örnek olarak oluşturduğum dosyaya buradaki Github reposundan ulaşabilirsiniz. Yine de Pandas üzerinden Github’daki dosyayı çağırıp bir inceleyelim. Aşağıdaki tabloda rahat gösterim açısından CSV formatında dosyayı aktarım. Ama kod temel olarak Excel (.xlsx) uzantılı dosyada çalışacak şekilde ayarlı.

url = "https://github.com/yigitsener/word-test-game/blob/main/wrod_list.csv"
df = pd.read_csv(url + "?raw=true", error_bad_lines=False)
print(df)

Tabloda görüldüğü üzere İngilizce kelimelere karşılık gelen birden çok Türkçe kelime olması durumunda onlar “,” ile ayrılmış durumda. Puanlar kısmı şimdilik boş o tarafı otomatik olarak akışta doldurulacak şekilde işletilecek.

Yavaş yavaş oyunumuzu yazmaya başlayalım. Elimizde yukarıdaki gibi bir Excel dosyasını aynı kod ortamında olduğunu hayal ederek aşağıda hataları da yakalayan kodu yazarız.

filename = "word_list.xlsx"
try:
df = pd.read_excel(filename)

except:
text = "Plesa check filename, path or pip install xlrd openpyxl"
raise ValueError(text)

DataFrame içerisine aldığımız tabloda boş gelen puanlar varsa dolduruyoruz.

df[["T_puan", "E_puan"]] = df[["T_puan", "E_puan"]].fillna(3).astype(int)

Oyun içinde çıkmak istediğimizi bildirdiğimiz anda son puan durumlarını aynı yerdeki Excel üzerine güncelleyerek kaydedecek fonksiyonu yazalım. Bu fonksiyonu birkaç yerde kullanacağız.

def saveWorkSheet(data=df):

data.to_excel(filename, index=False)

print(f"Worksheet is saved in {filename}\n")
print("Scores")
total_puan = data.shape[0] * 3
print(f"English score: {total_puan}/{total_puan - data.E_puan.sum()}")
print(f"Turkish score: {total_puan}/{total_puan - data.T_puan.sum()}")

Fonksiyon dosyayı kaydettikten sonra otomatik olarak Türkçe ve İngilizce puan durumlarını ekrana basmaktadır. Fonksiyonu çalıştırıp bir test edelim.

Verimiz içerisinde 30 adet kelime bulunduğundan ve her kelimede başlagıç puanı 3 verildiği için toplamda 90 puanımız yer alıyor.

Amacımız ise bu 90 puanı olabildiğince sıfıra yaklaştırmak.

Artık döngülere girebiliriz. Kullanıcının hangi dilde alıştırma yapmak isteyeceğini belirlediğimiz alanı While döngüsü içerisinde kuruyoruz. Sırayla gidelim.

Döngü içerisinde öncelikle tüm Excel dosyasının içerisinde puanların sıfırlanmış olmasını denetleyen bir koşul ile kontrolümüzü sağlayalım.

while True:

if df.E_puan.sum() == 0 and df.T_puan.sum() == 0:
print("All words is successfully finished")
print("Please adds new words in Excel file")
break

Kullanıcıdan aşağıdaki seçimlerden birisini yapmasını isteyeceğiz.

  • e: İngilizce-Türkçe alıştırma
  • t: Türkçe-İngilizce alıştırma
  • r: Rastgele beş kelimenin puanını artırıyoruz.
  • q: Programdan çıkış
while True:

if df.E_puan.sum() == 0 and df.T_puan.sum() == 0:
print("All words is successfully finished")
print("Please adds new words in Excel file")
break

type = input("== Which is suitable for you?\nEnglish = e\nTurkish = t\nrandom add puan = r\nquit = q\n--> ")

if type not in ["e", "t", "r", "q"]:
print("The choice must be one of them \ne, t, r or q\n\n")
continue

if type == "q":
print("\n\n\n...GOOD BYEEEE...\n")
break

Yukarıda görüldüğü üzere kullanıcıdan input bilgisi alındıktan sonra gelen değerin doğruluğu kontrol ediliyor. Eğer “q” gelmiş ise döngüden/programdan çıkılıyor.

Eğer kullanıcı kelime havuzu içerisinde rasgele beş kelimenin puanının artırılmasını isterse aşağıdaki yeni döngü çalışır.

if type == "r":

exists = []
x = 0
while x < 5:

if len(df[df["E_puan"] == 0]) + len(df[df["T_puan"] == 0]) < 6:
print("breaking to fill random value because zero value reduced")
break

r_index = random.randrange(0, len(df), 1)
if r_index in exists:
continue

exists.append(r_index)

language_puan = random.choice(["E_puan", "T_puan"])
language_p_value = df.at[r_index, language_puan]
if language_p_value != 0:
continue

df.at[r_index, language_puan] = language_p_value + 1
print("add puan")
x += 1

saveWorkSheet(df)

continue

Görüldüğü üzere puanı düşük olan beş kelime bulunarak rastgele puanları artırılıyor. Bu işlem bittikten sonra Excel kaydediliyor. Ardından yine kullanıcıdan ne yapmak istediği ile ilgili input isteniyor.

Bu parçaların da yukarıdaki koda eklenerek son haline bir bakalım

İngilizce veya Türkçe alıştırma seçen kullanıcı için karşısına 3 tane seçenek geliyor.

  • 1: Rastgele 10 adetten oluşan kelime havuzu seçilerek sadece bu sözcükler içinde alıştırma yapılır.
  • 2: Tüm dosya içerisinde rastgele bir adet seçilerek alıştırma yapılır. Kullanıcı tarafı sonlandırana kadar veya puanlar sıfırlanıncaya dek devam eder.
  • q: Çıkış

Aşağıdaki kod rastgele DataFrame içerisinde 10 adet satırı seçerek işaretliyor.

# seçilecek olan kelime sayısı
split_size = 10

# datada yer alan toplam satır sayısı
row_count = df.shape[0]

# seçilmeye elverişli splitlerin listesi
split_list = []

# toplam satır sayısına kadar tüm sayılar iterasyona alınır
# for döngüsü içerisinde 10'a bölünenler listeye dahil edilir
for i in range(1, row_count):
if i % split_size == 0:
split_list.append(i)

# liste içinde rastgele bir sayı seçilir
final_step = random.choice(split_list)

# seçilen sayıdan 10 çıkartılarak aralık belirlenmiş olur
initial_step = final_step - split_size

Kullanıcının kelime gösterim seçimi sonrası yapılan kontrollere bir bakalım.

# döngü içerisinde kontroller mevcut
while True:

# eğer ingilizce ya da türkçe bir alıştırma seçildi ise
# kelime gösterim/seçim tarzı soruluyor
if type in ["e", "t"]:
print("\nChoosing method for testing")
ans = input(
f"\n1- Select randomly in {split_size} words\n2- Select randomly in all data\nq = Quit\n-->")


# input olarak beklenen değer dışında bir değer geldiyse uyarı çıkar
if ans not in ["1", "2", "q"]:
print("The choice must be one of them \n1, 2 or q\n-->")
continue

# cevap çıkış ise önceki verilen cevap ile işaretlenir
if ans == "q":
type = "q"
break

# cevap bir ise belirtilen değişkenlere atama yapılır
if ans == "1":
initial, final = initial_step, final_step
break

# cevap 2 ise belirtilen değişkenlere tüm satırları içerecek atama yapılır
if ans == "2":
initial, final = 0, len(df)
break

# kontrol hariç her koşulda döngü sonlandırılır

Artık soru cevap oyununa gelebiliriz.

while True:

# kelime gösterimde tanımlanan rastgele değerlerin rastgele seçimi yapılır
r = random.randrange(initial, final, 1)

# Türkçe kelime oyunu için tanımlamalar yapılır
if type == "t":
p = df.at[r, "T_puan"]
words = "T"
puan = "T_puan"

# ingilizce kelime oyunu için tanımlamalar yapılır
if type == "e":
p = df.at[r, "E_puan"]
words = "E"
puan = "E_puan"

# rastgele atanan sayı index'e verilerek İngilizce kelime bulunur
english = df.at[r, "E"]

# rastgele atanan sayı index'e verilerek Türkçe kelime bulunur
turkish_string = df.at[r, "T"]

# birden çok Türkçe kelime liste içerisine alınır
turkish = df.at[r, "T"].split(",")

# aynı satırda yer alan Türkçe ve İngilizce keliemler aynı listeye eklenir
turkish_and_english = turkish + [english]

# seçilen kelime dilinin puanı 0 ise döngü sona erer
if df[puan].sum() == 0:
saveWorkSheet(df)
break

# seçilen kelime grubunun puanı 0 ise döngü sona erer
if df[(df.index >= initial) & (df.index < final)][puan].sum() == 0:
break

# seçilen kelimenin puanı 0 ise başka kelimeye geçilir
if p == 0:
continue

# karşılığı istenen kelime için kullanıcıdan input istenir
answer = input(f"\n{df.at[r, words]}\n-->")

# kullanıcı cevabı "q" ise bir üst kullanıcı menüsüne geçilir
if answer == "q":
saveWorkSheet(df)
break

# kullanıcı cevabı doğru ise puan 1 azaltılır
if answer in turkish_and_english:

print("\nTRUE!!!")

df.at[r, puan] = p - 1

print(f"{english} = {turkish_string}\n--Önceki Puan: {p}\n--Yeni Puan: {df.at[r, puan]}")
continue

else:

# cevap yanlış ise puan düşülmez ve doğrusu gösterilir
print("\nFALSE")
print(f"English: {english}")
print(f"Turkish: {turkish_string}")

Artık tüm kodları bir arada görelim. Fark edeceğiniz üzere artık bir fonksiyon içerisinde hepsi. Dolayısıyla fonksiyonu çalıştırdığımızda oyun Python Run akışında başlayacaktır.

Aşağıdaki fonksiyonu da koda ekleyerek çalıştıralım.

vocabularyTest(filename="word_list.xlsx")

Oyun başladı.

İngilizce olarak seçimimizi yaptık. Bakalım sırada ne var.

Artık soru cevap oyunumuza başlayabiliriz.

Yanlış ve doğru cevaplarla da örneklerimizi gördük.

Kesinlikle kullanıcı dostu bir arayüz değil. En azından mantık dilediğim gibi işliyor.

Daha Ne Yapılabilir?

  • Web APP olarak Flask veya benzer kütüphanelerden yararlanılıp UI/UX olarak doyurucu bir arayüz yapılabilir. Herkese açık bir hale getirilebilir.
  • Mobil uygulaması tasarlanabilir. Veriler NoSQL olarak tutularak hızlı bir mimari kurulabilir.
  • Dikkat ettiyseniz Excel’de Total_Wrong diye bir kolon var. O alan şu an boş ancak yapılacak çalışma ile en çok yanlışlık yapılan kelimeler çıkarılabilir. Ve bu alan makine öğrenmesi algoritmaları ile kişinin kendisinin en zayıf olduğu kelime gruplarının ortak özelliklerinin çıkarımında kullanılabilir.
  • Kod yeniden düzenlenerek sadeleştirilebilir.
  • Test yazılabilir

Sonuç

Böylesine basit bir oyun yazmak bile Python’a dair bilgilerimizi geliştirmemizde Pandas’ın farklı özelliklerini keşfetmemize vasıta oluyor. Dolayısıyla öğrenmeyi daha çok kolaylaştırması için yazdığımız program sayesinde farklı şeyler öğrenmekte bir başka keyif. 🙏

--

--