Markov Zinciri İle Anlamlı Gibi Görünen Metin Üretme

0
FZ

Markov Zinciri Algoritması

Bu makale özgün bir makale olmayıp Kerninghan ve Pike'ın The Practice of Programming kitabındaki 3. bölümün tercüme edilmiş, kısaltılmış, değiştirilmiş halidir. Makaledeki tüm eksikliklerden, teknik yanlışlıklardan, vs. Emre "FZ" Sevinç sorumludur.

Anlamlı Gibi Görünen (!) Doğal Dil Üretimi

Bir insan dilindeki (İngilizce gibi) cümleleri belli bir algoritmaya göre üretmek ve bunların doğal görünmesini yani sanki bir insan tarafından üretilmiş gibi görünmelerini sağlamak mümkün müdür? Bunun için hangi algoritma kullanılabilir ve bu algoritma hangi "bilgisayar dillerinde, nasıl" uygulanabilir?

Gelişigüzel dil üretiminde en basitinden dili oluşturan alfabeden yola çıkabilir ve harfleri (ve boşlukları, noktalama işaretlerini, vs.) gelişigüzel (random) dizerek bir çıktı elde edebiliriz:

asdfazxc zxceaqwe weaczcsd asdfgg

Pek anlamlı görünmüyor! Bir adım öteye geçip söz konusu dildeki (bu makale bağlamında İngilizce) harf frekanslarını kullanabiliriz. Yani dilin insanlar tarafından doğal kullanımında en çok tekrarlanan harflerin daha yüksek olasılıkla görünmesini sağlayarak örneğin şöyle bir çıktı elde edebiliriz:

idtefoae tcs trder jcii ofdslnqetacp t ola

Ancak yukarıdaki harf dizisinin de anlamlı olduğu söylenemez. O halde bir adım daha ileri gidip İngiliz dilini oluşturan sözcükleri gelişigüzel dizen bir algoritma ile bir şeyler yapmayı deneyebiliriz:

zenith book on car cake take rule over silly sample

Eğer daha iyi ve doğal görünen sonuçlar istiyorsak o zaman yapmamız gereken şey daha çok "yapısal bilgi" barındıran bir istatistik modeldir, örneğin harf frekanslarının ötesinde kendi içinde anlamlı söz öbeklerinin frekansı gibi. Peki bu tür bir istatistiksel bilgiyi nasıl elde edebiliriz?

Bunun için söz gelimi upuzun bir İngilizce metin alıp bunu detaylı olarak inceleyebiliriz ancak bundan daha basit ve eğlenceli bir yöntem mevcuttur. Herhangi bir metni alıp, dilin o metindeki kullanımının istatistiksel yapısını yansıtan bir modele göre yepyeni ve gelişigüzel kurulmuş bir metin üretebiliriz.

Markov Zinciri

Yukarıdakine benzer bir düşüncenin somut uygulamalarından birinin ismi Markov Zinciri Algoritmasıdır. Eğer girdi metnini üst üste binmiş (overlapping) söz öbekleri (phrases) olarak görürsek, bu algoritma her söz öbeğini iki parçaya ayırır: birçok sözcükten oluşan bir "prefix" grubu ve tek sözcükten oluşan, "prefix"i takip eden bir "suffix". Markov Zinciri Algoritması, prefix grubunu takip eden bir suffix'i gelişigüzel seçer ancak bunu yaparken orjinal metindeki sözcük grubunun istatistiksel yapısını yansıtır. Genellikle üç sözcükten oluşan söz öbekleri - iki sözcüklük prefix grubu ve tek sözcüklük suffix - ilginç sonuçlar üretebilir. Algoritmayı daha açık ifade etmek gerekirse şöyle yazabiliriz:

    w1 ve w2 değişkenleri girdi metnindeki ilk iki sözcüğün değerini alsın
    w1 ve w2yi bas
    döngü:
        w1 w2 prefix grubunu takip eden suffix'lerden birini 
        gelişigüzel seç ve bunu w3 değişkenine yerleştir
        w3ü bas
        w1e w2yi, w2ye w3ü yerleştir
        döngüye devam et

Algoritmanın nasıl çalıştığını somut bir İngilizce metin üzerinde inceleyelim:

Show your flowcharts and conceal your tables and I will be mystified. Show your tables and your flowcharts will be obvious. BİTİŞ

Bu örnek girdi metnindeki bazı sözcük çiftlerini ve bunları takip eden sözcükleri yazmak gerekirse:

Girdi prefix'i: Takip eden suffix'ler:
Show your flowcharts tables
your flowcharts and will
flowcharts and conceal
flowcharts will be
your tables and and
will be mystified. obvious.
be mystifed. Show
be obvious. BİTİŞ

Markov Zinciri Algoritması yukarıdaki girdi metnini işlemeye başlar ve önce Show your sözcük öbeğini basar hemen ardından ise ya flowcharts ya da tables sözcüğünü seçer. Eğer birincisini seçerse o zaman halihazırdaki prefix your flowcharts olur ve bunu takip eden suffix de and ya da will olacaktır. Eğer ikincisini yani tables sözcüğünü seçerse o bir sonraki sözcük and olmak durumundadır. Bu işlemler dizisi "yeterince" sözcük üretilene ya da suffix olarak BİTİŞ ile karşılaşana dek devam eder.

Programımız bir İngilizce metni okuyacak ve sabit sayıda sözcükten oluşan söz öbeklerinin (prefix'ler) metin içinde kaç göründükleri bilgisine yani frekanslarına dayanarak ve Markov Zinciri Algoritmasını kullanarak yeni bir metin oluşturacaktır. Bir prefix'i oluşturan sözcüklerin sayısı algoritmanın parametrelerinden biridir ve bizim örneğimizde bu sayı 2'dir. Prefix'teki sözcük sayısını düşürmek anlamlı metin üretmeyi güçleştirecek, artırmak ise girdi metninin olduğu gibi kopyalanmasına yol açacak ve bu da ilginç bir sonuç oluşturmasını engelleyecektir. Deneysel olarak görülmüştür ki İngilizce metinler için iki sözcükten oluşan bir prefix kullanmak ve buna göre bir suffix seçmek uygun olmakta, orjinal metne benzeyen, anlamlı gibi görünen ama aslında o kadar da anlamlı olmayan bir metnin üretilmesine yol açmaktadır.

Bir "sözcük" nedir? Açıktır ki bir dizi karakterden oluşan bir öbektir ancak sözcüğe bitişik olan noktalama işaretleri de onun bir parçası olarak kabul edilmeli midir? Yani "word" ve "word," iki farklı sözcük olarak mı işlenecektir? Bu şekilde kabul edilmesi çıktı metinde noktalama işaretlerinin de dağıtılmasını sağlamakta ve sonuçları daha ilginç kılmaktadır, böylece çıktı metnin grameri de dolaylı yoldan etkilenmiş olmaktadır. Dezavantajı ise açılıp da kapanmayan parantezler, tırnaklar gibi hatalı durumlardır. Bu sebeplerden ötürü "sözcük" iki boşluk arasında kalan herhangi bir karakter öbeği olarak tanımlanacaktır. Böylece girdi dili üzerinde herhangi bir kısıtlama getirmemiş ve noktalama işaretlerini de elemek ya da özel olarak işlemek gibi bir görevden kurtulmuş oluruz. Pek çok programlama dilinde girdinin "boşluklarla ayrılmış sözcükler" olarak yorumlanmasını sağlayan rutinler bulunduğu için yukarıdaki tanımlama algoritmanın somut olarak uygulanmasında da bize kolaylık sağlayacaktır.

Bu yöntem yüzünden çıktıdaki tüm sözcükler, tüm iki sözcüklü öbekler ve tüm üç sözcüklü öbekler girdi metninde de bulunmak zorundadır ancak sonuç olarak orataya dört ya da daha çok sözcükten oluşan söz öbekleri de çıkacaktır. Bu algoritmayı çalıştıran bir programa Richard Stallman'ın Özgür Yazılım hareketi ile ilgili bir kitabın ilk bölümü verdildiğinde şöyle bir çıktı elde edilmiştir (bir kısmı gösterilmiştir):

"The new printer was a refusal on the laser printer," Stallman says. Memory is a sizable one. It wasn't long before Stallman, increasingly an outcast even within the electrical plumbing of the Golden Rule, the baseline moral dictate to do unto others as you would have been no righteous anger, an emotion that, as we soon shall see, has propelled Stallman's career as surely as any political ideology or ethical belief. "From that day forward, I decided this was something I could express them in a more ordinary path, one balancing the riches of a human operator. Figuring that these human operators would always be on hand to fix the problem, chances were higher that the problem and the AI Lab and its indigenous population of programmers. Indeed, the best programmers at the time, a reflection of both the commercial value of the compromise deal that allowed hackers to work on the laser printer," Stallman says. Memory is a funny thing.

Algoritmanın Bilgisayar Programı Olarak Uygulanması

Girdi metninin büyüklüğü ne kadar olacaktır? Program ne kadar hızlı çalışmalıdır? Bu programdan bir kitap uzunluğunda veri işlemesini isteyeceğiz dolayısı ile n = 100.000 sözcüğü işleyebilecek kapasitede olmasını beklemek doğaldır. Çıktı metni ise yüzlerce, belki de binlerce sözcükten oluşacaktır ve bu veri program tarafından birkaç dakikada değil en fazla birkaç saniyede işlenmelidir.

Markov algoritması çıktı üretmeye başlamadan önce tüm girdiyi okumuş olmalıdır ve bunu bir şekilde hafızada depolamalıdır. Seçeneklerden bir tanesi tüm girdiyi tek bir uzun karakter dizisi şeklinde depolamaktır ancak yukarıda da belirtildiği gibi metni sözcüklere bölmek daha anlamlıdır. Eğer bu yapıyı tek tek her bir sözcüğü gösteren işaretçi (pointer) dizisi olarak kurarsak çıktı üretmenin kuralı basit olacaktır: Üretilecek her sözcük için girdi metnini tara, mevcut prefix'i takip eden suffix'lerden birini bul, bulduklarından bir tanesini gelişigüzel seçip bas ve işleme devam et. Ancak burada bir problem var: her bir sözcük üretimi için 100.000 sözcüklük diziyi taramamız gerekir ve misal 1000 sözcüklük bir çıktı üretmek istersek bu, yüz milyonlarca kıyaslama yapacağımız anlamına gelir. Dizi kıyaslaması vakit alan bir iştir özellikle yüz milyonlarca kez yapılması gerektiğinde.

İhtiyacımız olan şey bir prefix'i ve onun takip eden yani onunla bağlantılı (associated) suffix'leri depolayacak bir veri yapısıdır. Program iki aşamalı olarak çalışacaktır, birinci aşamada yukarıdaki yapı kurulacak; ikinci aşamada bu veri yapısı kullanılarak belli ölçüde gelişigüzel çıktı üretilecektir. Her iki aşamada da bir prefix'i çok hızlı bir şekilde bulabilmemiz gerekir: birinci aşamada, suffix'leri güncelleyebilmek için; ikinci aşamada ise olası suffix'lerden birini gelişigüzel seçebilmek için. Tüm bu ihtiyaçlarımızı karşılayacak olan veri yapısı bir "hash" tablosudur. Tablo anahtarları prefix'ler, tablo değerleri ise bunlara karşılık gelen suffix'ler olacaktır.

Örnek uygulamada iki sözcükten oluşan prefix'ler kullanılacaktır yani çıktıdaki her sözcük kendisinden önce gelen ikili sözcük grubu tarafından belirlenecektir. Prefix'i oluşturan sözcük sayısı program tasarımını etkilememelidir ve zaten program da en genel halde herhangi sayıda sözcükten oluşan prefix'leri kabul edebilmelidir ancak bu sayıyı sabitlemek programın tasarlanmasını ve anlaşılmasını kolaylaştırmaktadır. Prefix ve onu takip eden suffix'ler kümesi, Markov algoritmaları ile ilgili literatürde dendiği gibi bir durum (state) oluşturur ve bu tür algoritmaların temeli de bir durumdan diğer duruma geçişe dayanır.

Bir prefix verildiğinde onu takip eden tüm suffix'leri depolamamız gerekir ki daha sonra bunlara erişebilelim. Suffix'ler sıralı değildir ve birer birer eklenirler. Önceden kaç tane olacağını bilemeyiz bu yüzden de kolayca büyüyebilen bir liste ya da dinamik bir dizi gereklidir. Çıktı üretmeye başladığımızda belli bir prefix'le ilişkili, bağlantılı (associated) suffix'lerden bir tanesini gelişigüzel seçmemiz gerekir. Listedeki elemanlardan hiçbiri programın çalışması esnasında silinmeyecektir. Yani sadece ekleme söz konusudur. Bu şartları göz önünde bulundurduğumuzda her bir elemanı bağlı listelerden oluşan ve statetab olarak isimlendireceğimiz bir hash tablosu işimizi görecektir. Bu yapıyı şematik olarak şu şekilde düşünebiliriz:

file

Markov Zinciri Algoritmasının C programlama dili ile uygulaması yukarıdaki yapı temel alınarak hazırlanmıştır. Bu uygulamada tüm yapı sıfırdan kurulmuş ve ekleme, arama, tarama gibi tüm işlemler açık ve detaylı olarak kodlanmıştır. C dilindeki uygulama en uzun olanıdır, bununla birlikte çalışabilir makina kodu olarak derlenebilmekte, bu hali ile en az yer kaplamakta ve en hızlı çalışan uygulama olmaktadır. C++ uygulaması ise STL (Standart Template Library) içindeki hazır ve genelleştirilmiş veri yapılarını ve algoritmaları kullanmaktadır, bu sayede hata yapma ihtimali çok daha düşük olmakta, bir önceki uygulamaya göre kodlaması çok daha bir soyut seviyede gerçekleşmekte ve kısa sürmektedir. Bu program da makina diline derlenebilmekle birlikte bir önceki örneğe kıyasla çok daha fazla yer kaplamakta ve daha yavaş çalışmaktadır. Algoritmanın AWK uygulaması mawk isimli AWK yorumlayıcısı tarafından çalıştırılmakta ve makina koduna derlenmemektedir. Söz konusu örnek ilk iki örneğe kıyasla çok daha kısa bir uygulama olup altyapı detaylarını programcıdan gizlemekte, onun algoritmaya yoğunlaşmasını sağlamaktadır. Son örnek uygulama ise Perl uygulaması olup yine bir yorumlayıcı (Perl) tarafından çalıştırılmaktadır. En az sayıda kod satırına sahip (18 kod satırı) bu örnek karakter dizisi işlemleri için özel olarak optimize edilmiş Perl tarafından çalıştırılmakta ve performans olarak C++ ve AWK uygulamalarını geçmekte, kodlama kolaylığı ve soyutluğu olarak ise birinci sırada yer almaktadır.

Kabaca örneklerin performanslarını değerlendirmek için aşağıdaki tabloya bakabiliriz (C uygulaması gcc 2.95.4 ile, C++ uygulaması g++ 2.95.4 ile derlenmiştir. AWK yorumlayıcısı olarak mawk kullanılmıştır. Sistem Debian GNU/Linux 3.0 (stable) çalıştıran 256 MB ana hafızalı ve 1000 Mhz'lik Intel Celeron işlemcisili bir bilgisayardır. Derleyici kullanılması durumunda herhangi bir optimizasyon parametresi devreye sokulmamıştır. Orjinal makalede kullanılan ve İncil'in bir bölümü olan bu örnek girdi dosyası olarak kullanılmıştır.) :

Süre Satır Büyüklük
C 0.19 s 145 7689 byte
C++ 1.97 s 55 155279 byte
AWK 0.49 s 20 N/A
Perl 0.45 s 18 N/A

Sonsöz

Markov Zinciri Algoritması pek çok farklı İngilizce metine uygulanabilir ve anlamlı gibi görünen ama zorunlu olarak herhangi bir anlam içermeyen metinlerin üretilmesini sağlayabilir. Yapılan bazı denemelerde, deneklerin birtakım örnek çıktıları uzunca bir süre "anlamlı bir metinmiş" gibi ele aldıkları ve şüphelenmedikleri gözlemlenmiştir.

Bu algoritmanın sözcükler yerine farklı şeylere de uygulanması düşünülebilir: müzik notaları, bilgisayar programları, kullanıcı tepkileri (fare kliklemeleri, vs.). Doğal süreçlerin bu şekilde "yapaylaştırılması" ilginç sonuçlar doğurabilir.

Son olarak da, programlama tekniği açısında Perl ve AWK gibi diller kodlama kolaylığı ve pratiklik getirmekle birlikte C++ gibi nesneye yönelik diller farklı nesnelere aynı algoritmanın uygulanmasını kolaylaştırmakta, C dili ise belli bir ölçüde esneklik sunmakta ve asıl avantakını hafıza ve hız performansında göstermektedir.

Görüşler

0
anonim
metin uretme ornekleri :
iyi eglenceler..

ingilizce postmodern yazilar:
http://www.elsewhere.org/cgi-bin/postmodern/

fransizca postmoderne yazilar:
http://cristal.inria.fr/cgi-bin/postmoderne

http://cristal.inria.fr/cgi-bin/dada?brag.pb
// A SubGenius brag generator (Andrew C. Bulhak)

http://cristal.inria.fr/cgi-bin/dada?crackpot.pb
// A crackpot rant generator (Andrew C. Bulhak)

http://cristal.inria.fr/cgi-bin/dada?eqn.pb
// A generator of bogus equations in LaTeX format (Andrew C. Bulhak)

http://cristal.inria.fr/cgi-bin/dada?exam.pb
// A script to generate intimidating-looking but bogus
// examination questions. (Andrew C. Bulhak - unfinished)
// Expanded version by Lars Gustavsson 2000-08-03

http://cristal.inria.fr/cgi-bin/dada?exam_se.pb
// A script to generate intimidating-looking but bogus
// examination questions. (Andrew C. Bulhak - unfinished)
// Expanded version by Lars Gustavsson 2000-08-03
// Translated to Swedish 2000-08-03
// by Lars Gustavsson

http://cristal.inria.fr/cgi-bin/dada?legal.pb
// A script to generate legalese (Andrew C. Bulhak)

http://cristal.inria.fr/cgi-bin/dada?manifesto.pb
// A manifesto generator (Andrew C. Bulhak)

http://cristal.inria.fr/cgi-bin/dada?manifesto.pb
// The Postmodernism Generator (Andrew C. Bulhak)

http://cristal.inria.fr/cgi-bin/dada?pomo_fr.pb
// The Postmodernism Generator (Andrew C. Bulhak)
// Translated in French by Daniel de Rauglaudre

http://cristal.inria.fr/cgi-bin/dada?silly-word.pb
// A silly word generator

http://cristal.inria.fr/cgi-bin/dada?spout.pb
// The SubGenius Profunditied Generation Matrix

ZoM
0
FZ
Süper! :)
0
FZ
Biraz bağlam dışı gibi görünse de yukarıdaki örneklerle ilgili olarak Alan Sokal´in Son Moda Saçmalar Postmodern Aydınların Bilimi Kötüye Kullanmaları adlı kitabını herkese tavsiye ederim.
0
conan
ZoM? bu isim birsey cagristiriyor ama. ;)
0
FZ
Makaledeki programlardan birini kullanarak fantastik metin üretebilen arkadaşlar ürettiklerinin bir kısmını burada bizimle paylaşırlarsa sevinirim (girdi metnini de nereden aldıklarını belirtmek sureti ile tabii ki ;-)
0
tongucyumruk
1)Ucuz kitap almak için geri dönmüşlerdi. Lingaııa öyle bir şey giyinmemişti. Sakin bir sesle Biron'u göstererek ilâve etti:
- Şimdi sizi kaldığınız yere kadar götüreceğim ve yine manyetik alanı kuracağım. Basit bir moleküler yapı değişikliği olayı.
48
Kübü öbür taıafa çevirdi. Kübün yüzü yavaş yavaş saydamlaşmaya başladı,

www.kitap.perisi.com'dan indirdiğim Tyrann adlı Asimov kitabını arkadaşa input olarak verince böyle bir sonuç aldım. İşin komik yanı kitabın başındaki uyarı yazısı olan Ucuz kitap almak istiyorsanız önce sahaflara uğrayın yazısını romanla birleştirmiş olması hehehe. 48 ise aradaki sayfa numaralarından biri. Aslında önce borçlar kanunu ile denedim ama sonuç çok abuk subuk kelimeler (keenlemyekün gibi, evet var böyle bir kelime gerçekten) içeriyordu.
0
FZ
Süper ya! Türkçe bir metinde böyle bir sonuç verebileceğini tahmin etmiyordum :) Denemeni paylaştığın için teşekkür ederim.
0
conan
FZ, makalendeki ilk random cumleyi sadece sol elini kullanarak yazmissin! ;)
0
FZ
Algılama güçlüğümü mazur gör ama harbiden de ne demek istediğini anlayamadım :)
0
conan
>Gelişigüzel dil üretiminde en basitinden dili oluşturan alfabeden yola çıkabilir ve harfleri (ve
>boşlukları, noktalama işaretlerini, vs.) gelişigüzel (random) dizerek bir çıktı elde edebiliriz:
>
>asdfazxc zxceaqwe weaczcsd asdfgg

asdfazxc zxceaqwe weaczcsd asdfgg
``cumlesini`` yazarken sol elini kullanmissin, dusun bakalim hatirlamaya calis. Muhtemelen sag elinde mouse vardi...
0
FZ
Haaaaaaaa, diyorsun ki random gibi görünmüyor? :) Senin yerinde olsam dizinin gerisini görmeden karar vermezdim :)

Al sana random bir dizi:

1111111111111111111111111111111111111111111111....

:-P

Ha, bu arada, evet sol elim, güzel elim :-P
0
conan
secenek uzayi bir elemandan olusan bir kumeden de ancak bu sekilde random bir dizi cikardi :)))
0
conan
Bu arada hayli (highly) off topic bi yorum yaptim haberiniz olsun. :)))
0
FZ
Bir iki ek düşünce:

-2-3 cümlenin defalarca tekrar edilmesi sureti ile oluşan abuk sabuk metin dosyalarında en hızlı çalışan uygulama Perl uygulaması sonra da AWK. C uygulaması bunlara kıyasla 7-8 kat daha yavaş çalışıyor.

-Algoritmanın çıktısını yine algoritmaya verdiğimde yani bir tür geribesleme mekanizması kurduğumda ne olur, nasıl olur bunu denemedim.

-Notalara uygulamak! Biri bunu deneyebilir mi? Ortaya çıkan müzik nasıl olurdu acaba? ;-)
0
anonim
Markov zinciriyle beste yapılması, besteci ve eser analizi konusunda çalışmalar Gazi Üniversitesi Müzik Öğretmenliği Anabilimdalında yapılmaktadır. Bilgilerinize sunulur. Yaşasın Markov...
0
conan
ben bu programlari calistiramiyorum. :(
0
FZ
Hepsinde mi problem yaşıyorsun yoksa özel olarak C++ ya da Perl uygulamasında falan mı?

Çalıştırmak için tam olarak ne yaptığını ve ne gibi bir problemle ya da hata mesajı ile karşılaştığını söyler isen yardımcı olmaya çalışırım.

Haber bekliyorum senden.
0
conan
FZ,

Text inputu verdigimde C ve perl programlari sadece bu inputu kelime kelime ekrana dokuyor. Yani sanki her space karakterini enter karakteri ile degistirmis gibi oluyor.

Manali ya da manasiz text cikarma gibi birsey yok yani :(

Onun disinda compile, run gibi islemlerde sorun yok yani.
0
tongucyumruk
Tamam demekkiş çalışıyor. İlk bakışta program tam olarak dediğini yapıyor gibi gözüküyor. Ama tamamını okuduğunda aslında öyle olmadığı ortaya çıkıyor. Tabii verdiğin metnin uzunluğu da önemli.
0
anonim
hhmmm anlayamadim pek ne demek istedigini? :(
0
tongucyumruk
Demek istediğim ortaya çıkan metin ilk bakışta verilen metninm aynısı gibi gözükebiliyor, bunun sebebi bazı metin gruplarının metinde sadece bir yerde birarada bulunmaları olabilir sanırım. Ama sonuç metnin tanmamı okunduğunda aslında ortaya çıkan metnin yeni bir metin olduğu anlaşılıyor.
0
FZ
İlk bakman gereken şey girdi metninde belli bir prefix grubunu takip eden birden fazla suffix olup olmadığı, mantalite tamamen bunun üzerine kurulu. Bir de tabii içinde 'random' öğe barındıran bir algoritma olduğu için aynı input üzerinden birkaç kez geçirmeni tavsiye ederim. Gene benzer sonuçlar alıyorsan input metnini bana yolla bir de ben deneyeyim.

(FZ:7/24 destek, mestek hattı teşekkür eder iyi günler diler)
0
FZ
Ha bir de tabii şu her satıra bir sözcük mevzusu var, iş basit olsun diye herhangi bir formatlama kaygısı güdülmemiş ayrıca zaten makalenin alındığı kitapta birkaç bölüm sonra fmt isimli bir awk scripti ile ufak bir format olayına da girdikleri için amcalar bu aşamada bununla uğraşmamışlar ama sakın zannetmeyesin ki programın yaptığı boşluk karakterini enter karakterine çevirmek :) Eğer öyle olsa idi kodun optimize olduğu pek söylenemezdi :)
0
Roadrunner
Yine gec kaldim :P
0
malkocoglu
Guzel bir site, ve makale de cok guzel olmus. Bu seviyede bilgi paylasimi cok gerekli.

Calismalarinizda basarilar

1
ybp

Yazının sonunda bulunan örnek girdi hariç taşıdım buraya. Örnek uygulamaları da taşısam mı?

Görüş belirtmek için giriş yapın...

İlgili Yazılar

Herhangi Bir Metnin Hangi Dilden Olduğunu Hızlıca Anlama

FZ

Yapay zekâ dersim için Prolog ile boğuşurken ve comp.lang.prolog haberleşme/tartışma grubunu mesaja boğarken oraya katkıda bulunan bir hocanın, Gertrand Van Noord'un enteresan bir çalışması dikkatimi çekti.

Perl ile yazılmış bir tür dil kategorizasyon programı. Yani bir GİRDİ'ye bakıp, "hmm bu Türkçe" diyor, başka bir girdiye bakıp "hmm, bu da Portekizce" diyor ve bunu kısa sürede, yüksek başarım oranı ile, 69 farklı dil için yapıyor. Açık kodlu, özgür yazılım kategorisinde alan TextCat'in bir de web demosu var.

Van Noord, TextCat'in ticari ve ticari olmayan rakiplerini de sıralamış. Kendi yazılımına dil sayısı olarak en çok yaklaşan yazılım XEROX Language Identifier ticari bir yazılım ve 40 civarı dil ayırt edebiliyor.

Hep birlikte tekrarlıyoruz: Özgür Yazılımı Seviyoruz! :)

Interbench: Linux Etkileşim Testi

Soulblighter

Daha önce bu haberde Linux çekirdeğindeki performans farklarından ve Intel işlemcilerin Linux çekirdeğinin performansına etkisini ölçen bir projeden bahsetmiştim.

Eğer siz de yeni bir çekirdeğe geçecekseniz veya sisteminizdeki donanımları güncelleyecekseniz ve oluşacak performans farkını merak ediyorsanız Interbench tam size göre...

Neden frameworklerden nefret ediyorum!

anonim

Bir baharat rafı yapmak için tahta, biraz çivi, çekiç, testere vb. birkaç alet mi edinmeliyim, yoksa "yüksek kaliteli", "endüstriyel üretim" bir baharat rafı için bir "general-purpose tool-building factory factory factory"ye mi ihtiyacım var?

Frameworkler, libraryler, middleware platformlar üzerine eğlencelibir yazı : Why I Hate Frameworks

GNU/Linux için yeni bir sözlük: YZC

ridvantulunay

YZC, yeni bir GPL lisanslı sözlük uygulaması.

0.02 sürümü ile yapısına Ezberletici eklenen 65.552 kelimelik güzel bir sözlük.

http://www.yaz-ar.com/home/yzc/ adresinden sözlüğe ve kaynak koduna erişebilirsiniz.

Sözlük GAMBAS ve SQLITE kullanılarak hazırlanmaktadır, ilerleyen sürümlerde yapısına sınavcı, genişletilebilirlik ve GTK desteği eklenecektir.

Satılık Tapınak

ctengiz

Borland'dan gelen son haberlere göre, Borland ALM (Application Lifecycle Management) pazarında yoğunlaşmak istediği için efsanevi Delphi'yi de içeren IDE ürünlerini satılığa çıkardı.