Nis 192016
 
5.709 views

Türkçe Hecelemede 6 Temel Kural

Türkçe, Fince ve Macarca gibi “Bitişimli Diller”dendir. Bu dillerde kelime kökleri sabit kalırken, sözcüklerin anlam değişikliği, yapılan eklerle sağlanır.

Türkçe heceler “sesli harflere” odaklanır. Her hecede mutlaka tek bir sesli harf bulunur. Bu sesli harf ya tek başına ya da ön veya arkasına gelen çeşitli sessiz harflerle birlikte “tek solukta” seslendirilen heceleri oluşturur. Kelimeler, bir veya daha fazla hece içerir.

Aşağıda özetleyeceğim heceleme algoritması Hürsel Kendir tarafından 1982 yılında verdiği tezde sunulmuştur. Buna göre öztürkçe veya yabancı kökenli kelimelerde kullanılan heceleri aşağıdaki 6 kuralla tanımlamak mümkündür:

a- Peşpeşe gelen iki sesli harf ayrı hecelere aittir
b- İki sesli harfin arasında bulunan tek sessiz harf ikinci sesli harfin oluşturduğu heceye bağlanır
c- İki sesli harfin arasında peşpeşe iki sessiz harf varsa, heceler sessiz harflerin ortasından ayrışır
d- İki sesli harfin ortasında ardışık üç sessiz harf varsa genellikle ilk iki sessiz ilk heceye, diğeri ikinci heceye katılır. Ancak üçüncü sessiz harf “R” ise, ilk sessiz birinci heceye, diğerleri ikinci heceye dahil olur.
e- İki sesli harfin arasında ardışık dört sessiz harf varsa genellikle heceler sessiz harflerin ortasından bölünür. Ancak üçüncü sessiz harf “R” ise, ilk üç sessiz harf ilk heceye, diğeri ikinci heceye katılır.
f- İki sesli harf arasında ardışık 5 sessiz harf bulunuyorsa, ilk üç sessiz harf ilk heceye, sonraki iki sessiz harf ise ikinci heceye katılır.

Aşağıdaki Python kodları yukarıda tanımladığımız algoritmayı kullanmaktadır.

# -*- coding: utf-8 -*-
#Yazar: Ahmet Aksoy
#Tarih: 19.04.2016
"""
Bu betikte kullanılan algoritma T. Hürsel Kendir'in 25.3.1982 tarihli tezinde sunulmuştur.
Algoritmanın geliştirilmesinde Güney Gönenç ve Ersin Töreci'nin çalışmaları referans
alınmıştır.
Algoritma ile ilgili ayrıntılara http://gurmezin.com/turkce-hecelemede-6-temel-kural/
adresinden ulaşabilirsiniz.
"""
import sys

SESLILER ="aeıioöuüAEIİOÖUÜ"

def sesliSay(kelime):
    say = 0; harita =''
    for i in range(len(kelime)):
        if kelime[i] in SESLILER:
            say += 1
            harita += '0'
        else: harita += '.'
        i += 1
    return say, harita

#kelime içindeki sesli harfleri sayarak hece sayısını saptar
def hecele(kelime, detayli):
    n,harita = sesliSay(kelime)
    if detayli: print("Hece (sesli) sayısı = {} Harita = {} ({})".format(n, harita, kelime))
    #Haritaya göre parçala
    heceler = ''
    i=0
    l= len(harita)
    while i < l-1:
        if harita[i]=='0':
            #a
            if harita[i+1]=='0':   #peşpeşe iki karakter de sesli
                #iki sesliyi ayır
                heceler += harita[i]+'-'
                i+=1
            #b
            elif i<l-2 and harita[i+1]=='.' and harita[i+2]=='0':
                #ilk sesliden sonra böl
                heceler += harita[i]+'-'
                i+=1
            #c
            elif i<l-3 and harita[i+1]=='.' and harita[i+2]=='.' and harita[i+3]=='0':
                #iki sessiz arasından böl
                heceler += harita[i:i+2]+'-'
                i+=2
            #d
            elif i<l-4 and harita[i+1]=='.' and harita[i+2]=='.' and harita[i+3]=='.' and harita[i+4]=='0':
                if kelime[i+3]=='r':
                    #birinci sessizden sonra böl
                    heceler += harita[i:i+2]+'-'
                    i+=2
                else:
                    #ikinci sessizden sonra böl
                    heceler += harita[i:i+3]+'-'
                    i+=3
            #e
            elif i<l-5 and harita[i+1]=='.' and harita[i+2]=='.' and harita[i+3]=='.' and harita[i+4]=='.'\
                    and harita[i+5]=='0':
                if kelime[i+3]=='r':
                    #üçüncü sessizden sonra böl
                    heceler += harita[i:i+4]+'-'
                    i+=4
                else:
                    #ikinci sessizden sonra böl
                    heceler += harita[i:i+3]+'-'
                    i+=3
            #f
            elif i<l-6 and harita[i+1]=='.' and harita[i+2]=='.' and harita[i+3]=='.' and harita[i+4]=='.'\
                    and harita[i+5]=='.' and harita[i+6]=='0':
                #ikinci sessizden sonra böl
                heceler += harita[i:i+3]+'-'
                i+=4

            else:
                heceler+=harita[i]
                i+=1
        else:
            heceler+=harita[i]
            i+=1
    heceler+=harita[-1]
    oz,yab,yok = ozturkce(heceler)

    return heceler, n, oz,yab,yok

def ozturkce(heceler):
    ozturkcehece =['0','.0','0.','.0.','0..','.0..']
    yabancihece = ['..0','..0.','...0','...0.','..0..','.0...','...0..','..0...']
    liste = heceler.split('-')
    oz = yab = yok = 0
    for hece in liste:
        if hece in ozturkcehece: oz+=1
        elif hece in yabancihece: yab +=1
        else: yok +=1

    return oz, yab, yok

def kelimeOku():
    kelimeler = []

    with open("/home/ax/PycharmProjects/trderlemx/gensozlukler/gensozluk-kit-rad-hur.txt",encoding="utf-8") as fin:
        for soz in fin:
            kelime=soz.split(' ')[1].strip()
            if len(kelime)>10:
                kelimeler.append(kelime)
    return kelimeler

def ana():
    kelimeler =['pıtırcık',"kraliçe","kontrol","strateji","stronsiyum","trençkot","kontrbas",
                "sprinkler","sfenks","ıstranca","endüstriyel","samsunspor","bursaspor"]
    #kelimeler =["endüstriyel","bursaspor"]
    #fout = open("yabanci_kokenli.txt","w", encoding="utf-8")
    fout=sys.stdout
    #kelimeler = kelimeOku()
    kelimesay =0
    for kelime in kelimeler:
        s,n,oz,yab,yok = hecele(kelime, False)
        #print(s)
        j=0; ss = '';tiresay=0
        for i in range(len(s)):
            if s[i]=='-':
                ss+='-'
                tiresay+=1
            else:
                ss+=kelime[j]
                j+=1
        #print(ss)
        if tiresay!=n-1:
            print(ss+"  ****** Hece sayısında tutarsızlık var! ******")
        else:
            if yok+yab==0:
                oztr = ''   #'Öztürkçe'
            elif yok>0:
                oztr = 'Belirsiz'
            else:
                oztr = 'Yabancı kökenli'
                #print("{} {}".format(ss,oztr),file=fout,flush=True)
            print("{} {} {} {} {}".format(ss,oz,yab,yok,oztr))

        kelimesay+=1
        #if kelimesay>10000: break

    fout.close()

if __name__ == "__main__":
    ana()

Bu algoritmanın “samsunspor” ve “bursaspor” gibi birleşik sözcükleri “sam-suns-por”, “bur-sas-por” şeklinde ve “doğru” şekilde hecelediğine dikkat edelim. “sam-sun-spor” veya “bur-sa-spor” hecelemeleri Türkçe heceleme kurallarına uymaz.

Yukarıda verdiğim kodlar Python3.5 uyumludur.

Ahmet Aksoy

Nis 072016
 
3.642 views

Lazarus ve Python Entegrasyonu

Lazarus ve Python entegrasyonu için çok basit bir örnek yapalım.

Python, vereceğimiz tam sayıların faktöryellerini döndürsün. Bunun için Python ile birkaç satırlık bir kod oluşturalım hemen:

# -*- coding: utf-8 -*-

import math
import sys

try:
    y = int(sys.argv[1])
    x = math.factorial(y)
    print(x)
except Exception as e:
    print(str(e))

Kod dosyamızın adı lazarus_test.py olsun.

Lazarus tarafında ise hem istediğimiz tam sayıyı seçebilelim, hem de Python’dan dönen yanıtları sergileyebilelim.

Lazarus kodlarımız da şöyle olsun:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, SynEdit, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls, Process;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Memo1: TMemo;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  proses : TProcess;
  liste: TStringList;
begin
  proses := TProcess.Create(nil);
  liste := TStringList.Create;
  proses.CommandLine:= 'python3 /home/ax/PycharmProjects/lazarus/lazarus_test.py ';
  proses.CommandLine:= proses.CommandLine + trim(Edit1.Text);
  proses.Options := proses.Options + [poWaitOnExit,poUsePipes];
  proses.Execute;
  liste.LoadFromStream(proses.Output);
  Memo1.Lines.Clear;
  Memo1.Text := liste.Text;
  liste.Free;
  proses.Free;

end;

end.

Form1 görüntüsü:

lazarus ve python

Bu da 50 faktöryel hesaplanmış hali.

Lazarus ve python entegrasyonu

Gördüğünüz gibi mekanizma çok basit bir şekilde çalıştırılabiliyor. Lazarus, python ile elde edilen sonuçları sergileme açısından pratik ve görsel bir araç olarak kullanılabilir.

Elbette ben eski bir Delphi kullanıcısı olmanın avantajlarını yaşıyorum. Ama siz Delphi veya Pascal ile daha önceden tanışmadıysanız, yeni bir dil öğrenmenin size ne kadar yük ve yarar sağlayacağını ayrıca dikkate almalısınız.

Konuyla ilgili sorularınız olursa, yorum alanından bana yöneltebilirsiniz.

Lazarus önünüzde yeni ufuklar açabilir. Deneyin, görün!

Ahmet Aksoy

Nis 062016
 
3.786 views

Lazarus ile ilk programım

Lazarus ile ilk programımEvet, Lazarus ile önceki gün yazmaya başladığım programı bitirdim. Programın adı Depocu. Bu program, kişisel notlarımı tuttuğum küçük bir uygulama. Tekrar ihtiyaç duyabileceğim pratik bilgileri bu uygulamayla elimin altında tutuyor, onları depoluyorum.

Veri tabanım MySQL. Windows üzerindeki veritabanlarımı toptan yedekleyip Ubuntuya aktardım. Depocu veritabanı da böylece hazır bir şekilde yeni işletim sistemime aktarılmış oldu.

Aslında tuttuğum bilgiler aşırı korumaya ihtiyaç duyan şeyler değil. Bilgi miktarı da çok fazla sayılmaz. Yani veritabanımın MySQL olması bile gerekmiyor. Belki ileride SQLite3’e geçerim. Ama şu anda MySQL’le devam etmeyi tercih ediyorum.

Depocuda, MySQL veritabanına bağlanmak için önce Lazarusun ön tanımlı SQLdb bileşenlerini kullandım. Hiç sorun çıkmadı. Gerekli tabloya ve içindeki verilere kolayca eriştim. Ama iş verileri güncellemeye, yeni veriler girmeye gelince durum biraz değişti. Biraz zaman ayırsam, ona da mutlaka bir çözüm bulurdum. Ama, daha kolayını seçtim ve Lazarusa, Delphide de kullandığım ZEOSLib bileşenlerini yükledim.

Yeni veri giriş ve güncelleme sorunu da böylece ortadan kalkmış oldu.

Programda not almış olduğum bazı internet adreslerine tek bir tuşla erişim özelliği bulunuyor. Windows ortamında bunu özel bir fonksiyonla halletmiştim. Ubuntuda bu işin de kolayına kaçtım. İnternet bağlantı bileşenleriyle uğraşmak yerine, sistemde zaten yüklü olan firefoxu komut modunda tetikleyip istediğim adresi parametre olarak yüklemesini sağladım. Daha fazlasına ihtiyacım yok zaten!

Böylece neredeyse 48 saat içinde araştırmaları, testleri ve Facebook yazışmalarıyla birlikte programımı kullanılabilir hale getirmiş oldum.

Bu arada debug bilgileriyle birlikte 50 küsur MB tutan çalışabilir kod dosyasını, debug bilgilerinden arındırarak 3 MB’a düşürdüm. Daha da küçültme olanağı bulunduğunu biliyorum ama, şimdilik gerek yok!

Önümüzdeki günlerde Lazarusu Windows ortamına da kuracağım. Böylece linux altında geliştirdiğim kodları Windows ortamında da derleyip aynen kullanabileceğim. Delphi programım Windows 10 kazası yüzünden silinmişti. Aylardır yeniden kurmamı bekliyor ama, belki de bundan sonra ona hiç ihtiyaç duymayacağım.

Bu arada bir başka gelişme daha oldu! Python ile Lazarusu birlikte kullanabileceğim. Lazarusu belki de bir tür menü ve raporlama aracı olarak, pythonu da internet erişimi, veri madenciliği, karmaşık hesaplamalar, oyunlar vb için kullanacağım.

Henüz hayallerimi fazla zorlamıyorum. Ama biliyorum ki, güzel şeyler olacak!

Gelişmelerden haberdar olmak için, beni izlemeye devam edin!

Ahmet Aksoy

Nis 052016
 
4.381 views

Legolarla Kodsuz Program Yazmak

Program yazmaktan korkanlar için tek bir satır bile kod yazmadan program geliştirmek mümkün.

Scratch isimli sistem işte tam da bunu yapıyor. Bu sistemde bir takım lego parçalarını sürükle-bırak yöntemiyle bir araya getirerek program yazıyorsunuz.

https://scratch.mit.edu/projects/103544500/ adresine bağlanıp “yeşil bayrak” butonuna tıklarsanız, basit bir Scratch programını da çalıştırmış olursunuz.

Kedinin sıçramalarını durdurmak için “kırmızı renkli” butona basmanız gerekir.

Bu programcığın kodlarını görmek istiyorsanız, sağ üstteki “Proje sayfasına bak” veya “See inside” yazan mavi tuşa basın. Karşınıza aşağıdaki görüntü gelecek. En sağdaki pencerede yer alan ve rengarenk parçaların birleşiminden oluşan şekil, programımızın ta kendisi.

Legolarla Kodsuz Program Yazmak

Dikkat ederseniz, ortalıkta klasik kod satırlarına benzer hiç bir görüntü yok.

Ama sağ penceredeki şekli biraz yakından incelerseniz, buradaki lego parçalarının aslında mantıksal gruplar oluşturduğunu farkedersiniz.

Scratch

Yukarıdaki resimde görülen lego parçalarının üzerindeki yazılar İngilizce. Ama isterseniz sistem dilini Türkçe yapar ve lego açıklamalarını da otomatik olarak Türkçeye çevirebilirsiniz.

Bu yazımda size Scratch programlarının nasıl yazıldığını anlatmayacağım. Bunu, daha sonraki yazılarıma bırakıyorum. Ama çok merak ettiyseniz, internette bu konuda ayrıntılı bilgilere erişebilmeniz mümkün. Google’a “scratch” sözcüğünü arattırdığınızda 235 milyon yanıtla karşılaşırsınız. İster Türkçe, ister İngilizce sayfalardan istediklerinizi inceleyebilirsiniz.

Scratch projesi, çocukları yazılım dünyasına kazandırmak amacını güdüyor. Çocuklar kod yazmaya, yazım ve mantık hatalarıyla uğraşmaya gerek kalmadan pek çok şey yapabiliyorlar. Elbette bu sistem her türlü profesyonel yazılımın bu yöntemle hazırlanabileceğini iddia etmiyor. Ama çocukların ilgisini çekmeyi, onların zihinlerinde görsel algoritmalar oluşturmayı başarıyor. Böylece çocuklar bir oyun atmosferi içinde görsel programlar tasarlayıp, elde ettikleri sonuçların tadını çıkarabiliyorlar.

Scratch, iki boyutlu bir sahne kullanıyor. Üç boyutlu projelere yönelik Alice gibi başka sistemler de var.

Önümüzdeki günlerde, burada, Scratch ile yazılmış bazı kodları ayrıntılarıyla inceleyen yazılar yayınlayacağım.

Eğer bu konu ilginizi çekiyorsa, beni izlemeye devam edin.

Ahmet Aksoy

Nis 042016
 
3.039 views

Ubuntu ve Lazarus

Ubuntu ve LazarusGeçen yıldan beri yazılım dili olarak Python ile uğraşıyorum. Özellikle veri madenciliği açısından olağanüstü olanaklar sunuyor. Pek çok alanda çok güçlü kütüphanelere sahip.

Ama bunca gücüne rağmen, Python, görsel programcılıktan uzak durmakta ısrarcı gibi. Doğrudan desteklediği neredeyse hiç bir görsel araç yok. Resmi olarak desteklediği belirtilen tkinter ise oldukça zayıf. Python programcıları ister istemez PyQt gibi harici çözümlere razı olmak zorundalar. Ve bu nedenle, ne kadar popüler olursa olsun, pythonun javayı yakalamada pek fazla şansı olmayacak gibi.

Pythonu komut modunda gayet verimli bir şekilde kullanabiliyorum. Bu açıdan bir sıkıntım yok. Ama öte yandan, uzun yıllar boyunca yazılım dili olarak Delphi-7 kullandım. Sadece kendim için yazdığım bir sürü ufak tefek uygulamalar var. Hatta bu uygulamalardan bazıları artık benim için “olmazsa olmaz!” hale gelmiş. İşte bu uygulamaları da Python ile yeniden yazabilmek istiyorum. Ama bir türlü aradığım araçları bulamıyorum.

Son günlerde yaşadığım bir başka önemli değişiklik te kullandığım işletim sistemi ile ilgili.

Bir kaç ay önce yanlışlıkla Windows 10 kurulumunu onayladığımdan bu yana bir türlü başım beladan kurtulmadı. Aynı gün içinde bilgisayarımın 5 – 6 kez çöktüğüne defalarca şahit oldum. Şu sıralar Windows “ehven-i şer” noktasına gelmiş olsa da, bu gelişmeler bana kesinlikle linuxa geçme kararı aldırdı. Bunu uygulamaya da soktum.

Şu anda dizüstü bilgisayarımda hem Windows 10, hem de Ubuntu 14.04 LTS yüklü. Birincil sistemim Ubuntu. Ancak çok gerekli olduğunda Windowsa geçiyorum.

İnternet bağlantılarımla ilgili hiç bir sıkıntı yaşamıyorum. Hatta çok daha rahatım. Gezgin olarak Chromium kullanıyorum.

Maillerimi Mozilla Thunderbird ile takip ediyordum. Ubuntuda da aynı programı kullanıyorum şimdi. Sadece fontlarla ilgili küçük sıkıntılarım var. Ama onu da kısa sürede çözeceğim.

Farklı Python sürümleri ve PyCharm elimin altında. Skype kurulu. Uzak erişim için TeamWiver kullanıyorum. Son dönemde ilgilenmeye başladığım Scratch 2 programı da kullanıma hazır bekliyor.

Evet, asıl eksikliğini duyduklarım, Delphi 7 ile kendim için yazmış olduğum o küçük programcıklar… Pythonun görsel araçlarına o yüzden ihtiyaç duyuyorum.

Ama iki gün önce önümde yepyeni bir sayfa açıldı: Lazarus.

Lazarus’un adını uzun zamandır biliyordum. Ama zaten lisanslı bir Delphi 7 kullanıcısı olduğum için pek te ilgilenmemiştim. İki gün önce GNU/Linux Türkiye grubuna sorduğum bir soruya cevaben bazı arkadaşlar Lazarus programını kullanmamı önerdiler. Hemen kurdum. Neredeyse bildiğim Delphi’nin aynısı. Hiç yabancılık çekmedim.

Elbette bazı ufak-tefek uyumsuzluklar çıkabilir. Buna hazırım. Ama bu kadar güzel bir çözüm bulabileceğimi hayal bile etmiyordum açıkçası.

Çok acelem yok ama, ilk programıma başladım bile. Eğer Delphide kullandığım bileşenlerin hepsi Lazarusta da mevcut olsaydı, Delphi kodlarını Lazarusa hemen dönüştürmek mümkün olacaktı.

Tamamiyle yeniden yazmam da en fazla bir-iki günümü alacak.

Gelişmeleri buradan duyurmaya devam edeceğim. Hatta bazı kodları buradan sizlerle de paylaşabilirim. Eğer bir Delphi kullanıcısıysanız ve linuxa geçmeyi planlıyorsanız, Lazarusun size Delphiyi pek fazla aratmayacağını rahatlıkla söyleyebilirim.

Ahmet Aksoy