TSpell Notlar Haziran 2004 1. Kok seciciler ve Performans Ne yazık ki hash secici istediÄim performansı saÄlayamadı, bir iki temizlik ve numara ekleyip yaklaÅık 280.000 kök/s de sabitledim, aslında yapılabilcek bir kaç Åey daha var. - String sınıfının toCharArray() metodu oldukça yavaÅ, eÄer kök seçiciye doÄrudan bir karakter dizisi gönderirsek %15-20 hızlanabilir. - Karsilastirma icin bir tur ozel hash degeri kullanilabilir, bu da %5-10 arasi bir getiri yapabilir. Ancak basit yapılı MapSecici zaten yaklasik 240.000 lik bir peformansa sahip o yuzden eziyete deÄer mi bilinmez, en iyisi Åimdilik bu çalıÅmayı ikinci plana atmak. Tabi MapSecicinin her zaman dogru adaylari getirmedigi bir gercek fakat gene de elde edecegimiz %20-25 lik ekstar performans icin simdilik kasmaya gerek yok.; 2.Kelimeler (TurkceHarf <- HarfDizisi <- Kelime) Su anda kullanmakta olduÄumuz bu yapının yerine (char[] <- Kelime) Åeklinde bir basitleÅmeye gitmenin getirisi ve götürüsü ne olur acaba? Getiriler: Daha basit bir yapı ve kolay debug, daha küçük bellek ihtiyacı Götürüler: Daha az modüler ve nesneye yönelimli yapı (ancak iyileÅtirilebilir) Belirsiz : Performans, nesnelerden doÄrudan çaÄrı ile yapılacak iÅler için bazı boolean kelime haritaları kullanılması gerekecek. Ancak bunlar nesne oluÅturma ve çaÄırma bedellerinden küçükse daha iyi performans gösterebilir. denenmeli. Soru: Kelime sınıfını "Java String" sınıfının Türkçe için özelleÅmiÅ bir versiyonu gibi kullanabilir miyiz? .... Nisan - Mayıs 2004 Refactoring ihtiyacı: Bir kelime enflasyonumuz var ve çözülmesi gerekiyor. Elimizdeki kelime, kök, sozluk kelimesi vs ye bir bakalım: TurkceHarf : Tek bir turkce harfi ifade ediyor, harfin kendisi, sirasi, sert, yumusakligi vs gibi bilgileri tasiyor. HarfDizisi : TurkceHarf dizisi tasiyan bir container. karmasik karsilastirma, buyuyebilme gibi ozellikleri tasiyor Kok : Istitsnalari ve kelimenin yalin halini tutan sinif. istisnalarin ve degisime ugramis hallerin olusmasinda kullaniliyor. Kelime : Icinde bir harf dizisi(HarfDizisi turunde) ve Kok tasiyan ana Kelime sinifi SozlukKelime : [Miadi dolmus]Benim eski sozlugu okumak icin yapmis oldugum istisnai durumlari ve kelime tipini tasiyan sinif SozlukKelimesi : SozlukKelime'nin yerini alan ve Kok karsilastirmasi isleminde kullanilan icinde istisnalari tasiyan Kok'u ve kelimenin kendisini tasiyan sinif. KelimeTuru : [Tartismali]aslinda bir enum. "bence bu sinif yokolabilir" bir kelimenin Turunu ifade etmek icin bu tur bir sinifa ihtiyacimiz yok, icinde sadece debug icin bir String tasiyor, onun yerine Kelime veya SozlukKelimesi siniflarindan birinin icine sabit int'ler koymak cok daha sade ve dogru. - FilteringStream MetinAraclari sinifinda hep benzeri isler yapiliyor, ozellikle injecterror ve ASCIIfyTurkish gibi minik araclar icin bir tür FilePipe yapmak iyi olacak soyle ki, bu pipe input olarak String, FileName veya Stream alabilecek, output olarak ta gene ayni turden bir cikti verecek. tabi bir suru constructor gerekli. Bir de StreamFilter arayuzu yapip FilteringStream'in okudugu karakterleri dizi olarak veya kelime olarak belirtilen StreamFileter'e verebilir. StreamFilter okunan veriyi isler ve geri verir. Sonuc olarak her seferinde dosya ac, kapa , oku yapmak yerine bir FilteringStream nesnesi olusturup uygun StreamFilter nesnesini - veya nesnelerini - register etmek yeterli olabilir. Bir ara yapacagim. Refactoring iyidir vesselam. - 13 Mart 2004 Karakter kodlaması.. bela mı bela. iÅin doÄrusu bu konuyu eskiden beri sevmezdim, konu Türkçe olunca gene hortladı tabi anında. - 10 Mart 2004 Ä°statistikler.. YaptıÄımız iÅlemler sırasında çeÅitli istatistikleri de tutabiliriz, biraz düÅünelim, en basitinden en tuhafına kadar. Verilen bir metin için: Yapısal olarak: - Harf sayısı - Hece sayısı - Kelime sayısı - Cümle sayısı - Hepsinin oranları (En çok kullanılan harf, hece, kelime vs.) - Ortalama kelime uzunluÄu - Ortalama Cümle uzunluÄu - En uzun kelime - En uzun cümle Imla denetimi ve Gramer yönünden : - isim, Sıfat, Fiil vs sayısı ve oranları - En sık kullandıÄı kelime, ek, hece - Kelime kökenlerine göre sayılar ve oranları (Arapça, Fransoıca vs.) - Denetim doÄruluk oranı - Kelimelerin anlamsal türlerinin oranı (Bilimsel, genel, hukuki vs) - Olumsuz cümle oranı ? - Soru cümlesi sayısı ? Gizli istatistikler - Genel Türkçe metinlerden sapma miktarı (genel Ek sıralamasından sapma oranı - cache-miss, Kök adayı vuru oranı vs. Bu istatistik bizim büyük miktarda veriyi taramamızdan sonra toplanabilir.) Tüm bu istatistikler herhangi bir metin için bir rapor Åeklinde sunulabilse iyi olurdu sanırım. Sözlük iÅini ben aldım. Elimizdeki kısmen dönüÅtürülmüŠsözlüÄü bizim istediÄimiz formata getireceÄim, diÄer taraftan da basit bir xml sözlük hazırlayacaÄım, hayırlısı. - 6 Mart 2004 Kelime sayısı ile ilgili tahminim hatalı olabilir, Osmanlıca kelimeleri ekleyince sayı ikiyüzbini bulabiliyor sanırım. Biraz sözlük üzerinde düÅünelim, Ahmet'in bu konudaki bilgisi çok daha geniÅ.. Kabaca sayacak olursak; Kelimenin biçimsel özellikleri - Türü (isim, sıfat, fiil, zarf, zamir, edat) - Orijini (Türkçe, Arapça, Farsça, Fransızca ...) - Sonu sert sessizle mi bitiyor? - DÄer özel durumlar (bunlar için Ahmet özel karakterler kullanıyordu) Anlamsal özellikler? - Sanırım bu konuda Åimdilik tam bir muamma.. Aslında sözlük giriÅi için basit bir php veya java arayüzü yapılıp bilgiler bir Musql veritabanına girilirse daha iyi olacakmıŠgibi görünüyor. binary ve xml sözlükler bu veritabanı sorgulanarak oluÅturulabilir. - 5 Mart 2004 Ä°MLA DENETÄ°MÄ° imla denetimi algoritması kabaca Åu adımlardan oluÅuyor 1. SözlüÄün okunması : Sadece en baÅta yapılıyor - Sözlük geniÅleyebilir yapıda, muhtemelen XML formatında olacak, ayrıca bu sözlüÄü binary formata dönüÅtüren bir kütüphane fonksiyonuna da ihtiyacımız olacak, ancak taban daima okunaklı ve esnek olan XML sözlük olmalı. Bu konuda yapılmıŠçalıÅmalar taban alınabilir. - Türkçede yüzbin civarında muhtemel kelime var, ortalama olarak xml versiyonunun 4-5 MB, binary versiyonunun da 1 MB civarında olması muhtemel. TaÅınabilirliÄi arttırmak için sıkıÅtırma yolu da denenebilir. 2. Denetim yapılacak kelime için ön inceleme - iÅlem yapılması - Ãok mu kısa? 'o' hariç. - Ãok mu uzun? <40 En uzun kelimemiz : ÃekoslovakyalılaÅtırabileceklerimizden ? - Geçersiz harf taÅıyor mu? <-- Azericede Q ve x var, o yüzden diyalektler için farklı olabilir. - Noktalama iÅsretlerinden arındırılmalıdır - Tamamen küçük harfe dönüÅtürülmelidir. 3. Kök adaylarının belirlenmesi. Bu, hassas bir konu. - Kitabım kelimesinin kökü 'kitap' tır ancak içinde kitap kelimesini barındırmaz. Dolayısıyla kök analizinde sert sessiz ile biten kelimelerin yumuÅak hallerinin de göz önüne alınması gerekiyor, bu durumda yumuÅama Åartı olan sert sessizden sonra sesli harf gelme kuralı da dikkate alınabilir. - Performans: ÃoÄu kelime için tek bir kök adayı bulunacaktır, ancak bazı kelimelerin çok miktarda adayı olabilir. örneÄin "Elmaslarının" kelimesinin Ãç adet aday kök'ü vardır "El","Elma" ve "Elmas". kök arama iÅleminin optimum olması kelime baÅına yapılan iÅ miktarını da azaltacaktır. - Bu noktada, sırf kök adaylarının hızla belirlenebilmesi için bellekteki sözlüÄün yanında daha hafif bir kök aday veri yapısının da bulundurulması anlamlı olabilir. Bu, belli bir bellek yükü de getirecektir, performans getirisi incelenmeli. 4. Kök yapıları: - Türkçe'de kök kelimeler, kelimenin türüne göre farklı ekleri alabilir ve ekler birbirine baÄlanırken belli kurallar vardır, bir eke sadce belli bazı ekler birleÅtirilebilir. Ahmet eski programda bu iÅ için bir ek matrisi hazırlamıÅtı, bu matrisi kullanmak gene anlamlı olabilir. 5. Adaylar üzerinde kelime üzerinden gidilerek muhtemel ekler sentezlenir - Ahmet'in örneÄi üzernden girdersek, "Elmaslarının" kelimesi için önce "El" kelimesi bulunur (Bu noktada enteresan bir soru, Ahmet örneÄinde El için önce çoÄul ekinin deneneceÄini ve Eller ile uyuÅmayacaÄından olmayacaÄını yazmıÅ. ancak ler - lar ekini denemenin bile anlamı yok, çünkü El'den sonra gelen harf zaten 'm', isim köküne 'm' ile baÅlayan ek gelemeyeceÄinden El, daha iÅin baÅında elenebilirdi. Belki de bu tür numaraları Åimdilik programa dahil etmemekte fayda var.) - Sentez sonucunda elde edilen kelime giriÅ kelimesine eÅit olduÄu zaman kelime denetlemesi baÅarı ile tamamlanır, eÄer aday kök kalmamıÅsa denetleme baÅarısız demektir. - Burada Perormans incelemesi yapılabilir, ayrıca adaptif algoritmalar kullanarak kök cinslerine göre , hatta her kök için gelmesi en muhtemel 2-3 ek'in indexi de sözlükle beraber tutulabilir, bu puanlandırmanın doÄru olabilmesi için ilginç Åey denenebilir - Programa milyonlarca kelime verilerek istatistiki bilgiler deÄerlendirilir - Metnin yapısına göre farklı ek seçim puanlandırılmaları yapabilir (jenerik, hukuki, bilimsel vs.) Performans çalıÅmasının bir diÄer ayaÄı da karÅılaÅtırma iÅlemlerindeki mini numaralar olabilir, hash deÄerlerinin karÅılaÅtırılması vs gibi. 6. Ä°stisnai durumlar KELÄ°ME TAVSÄ°YESÄ° Bozuk kelimeler için uygun tavsiyelerde bulunmak oldukça farklı bir yol izlemeyi gerektirebilir. Bu durumda da yakınlık analizi, kök türü, hatta kısmi bir anlamsal analiz çok daha iyi tavsiyelerde bulunulmasını saÄlayabilir. ÃrneÄin "Elmazlarının" kelimesi için "Elmalarının" ,"Elmaslarının", "Olmazlarının" tavsiyelerini verebilmek oldukça zorlu bir iÅmiÅ gibi görünüyor.