26 Mayıs 2009 Salı

Python ve Dizgi (String) İşlemleri

Python programlama dili Guido van Rossum tarafından geliştirilmiş, yüksek seviye veri tipleri olan, nesneye yönelik, esnek, kolay öğrenilebilen bir programlama dilidir. Unix ve türevleri, Mac, MS-DOS tabanlı, Windows ve OS/2 işletim sistemlerinde çalıştırabileceğiniz, anlaşılır yazımı ve mantığıyla, güçlü bir dildir. İsmi genel kanı olan piton yılanından değil, BBC'de yayınlanan "Monty Python" adlı bir komedi dizisinden gelmektedir.


NLTK'nin yazılmasında Python dilini tercih edilme sebeplerini Steven Bird şöyle sıralıyor: Kolay öğrenilebilme, yazı dili ve mantık dilini şeffaf olması, gelişmiş katar kütüphanelerine saip olması, nesneye dayalı programlamada veri ve yöntemlerin tekrar kullanılabilir olması, detaylı standart kütüphanesinin olması ve sayısal işlemeye uygun olması. [1]


Python öğrenmek konusunda en büyük kaynak kendi sitesindeki dökümantasyonudur. Bunun dışında Python hakkında detaylı bir kitap olan "Dive Into Python" elektronik halde http://diveintopython.org/ adresinden erişebilirsiniz. Python3.0 versiyonu için http://diveintopython3.org/ adresini kullanabilirsiniz. Dizgi sabitleri, biçimlemeler ve işlemleri için http://docs.python.org/library/string.html adresi kendi sitesindeki dökümanıdır. Bu konuda bana göre en iyi Türkçe kaynak ise pardus-linux sitesindeki açıklama ve örneklerdir. http://www.wiki.pardus-linux.org/index.php/Python%27da_Karakter_Dizilerinin_Metotlar%C4%B1Buradaki örnekleri kendiniz de çalışarak öğrenirseniz, ileride Nltk sınıf ve modülleri anlamada ve geliştirmede kolaylık sağlamış olursunuz.


NLTK'de sıkça kullanılan dizgi yordamları

str.lower()

İsminden de anlaşılacağı üzere büyük harfleri küçük harflere çeviren fonksiyon. Dil işlemede yapı ve anlam açısından "Masa" ve "masa" arasında bir fark olmadığı aşikardır. >>> print "Türkiye".lower()türkiye

Not: Nltk python 2.4 ve 2.5 sürümleri ile geliştirilmiş bir araçtır. Python varsayılan olarak utf8 karakter kümesinde karakterleri kodlasa da Türkçe karakterler için bu sürümlerinde hata bulunmaktadır. Karakter tablosu karışmış gibi görünmektedir. Nitekim bu konuda açılmış problem bildirimleri sitelerinde mevcuttur. http://bugs.python.org/issue1528802. Şu anda güncel sürümü olan 3.0 versiyonunda herhangi bir denemem olmadı. Ancak Pardus'ta bu problem için yazılmış yama bulunmaktadır.


Bu problemin önüne unicode olarak kodlanmış karakter dizilerini kullanarak geçmeyi kısmen başarabiliriz.


Türkçe karakterlerini göstermede herhangi bir sorun gözükmemektedir.

>>> print "ŞşİiÇçIıĞğÖöÜü"

ŞşİiÇçIıĞğÖöÜü


Küçük harfe çevirme fonksiyonu Windows üzerinde denediğimde büyük İ harfini küçük ı ya , büyük I harfini küçük i ye çevirmektedir.

>>> print "ŞşİiÇçIıĞğÖöÜü".lower()

şşıiççiığğööüü

Aynı fonksiyonu Ubuntu makinem üzerinde denediğimde "şşıiççıiğğööüü" çıktısını alıyorum


[1] Bird S., Klein E., Loper E., and Baldridge J., “MultidisciplinaryInstruction With the Natural Language Toolkit ”, 2008, http://aclweb.org/anthology-new/W/W08/W08-0208.pdf

21 Mayıs 2009 Perşembe

NLTK inceleme

İşlerin yoğunluğu sebebiyle uzun zaman önce başladığım bu bloğa birşeyler yazma fırsatım olmadı. İlk olarak doğal dil işlemenin tanımından, kapsamından, evrelerinden bahsetmiştim. Bu yazımda NLTK'yi genel olarak tanıtmayı, modüllerinden düzeysel bahsetmeyi planlıyorum. Daha sonra sırayla Pyton programlama dilinden, dil işleme için kullanılacak olan genel kütüphane ve fonksiyonları anlatmayı düşünüyorum.

Not: Yazılarımda mümkün olduğunca Türkçe terimler kullanmaya çalışıyorum. Yabancı kelimelerin Türkçe karşılıklarını bulamadığım durumlarda İngilizce sözcükler kullandığımı belirtmek isterim.

NLTK (Natural Language Tool Kit) - Doğal Dil Aracı
Python programlama dili ile geliştirilmiş ve geliştirilmekte olan yaklaşık 120.000 satır kod, 70'e yakın derlem(corpus) ve çok sayıda altbirimlerden oluşan açık kaynak bir araç. NLTK resmi sitesinden (www.nltk.org) nltk, matplotlib, numpy araçları indirilerek kurulum yapılabilir. Ayrıca python2.5 ya da 2.6 sürümlerinden biri kurulmalıdır. Nltk içinde yazılan modüller, matplotlip içerisinde grafik, şablon çıkarmak için sınıflar, numpy içinde ise sayısal hesaplama sınıfları bulunmaktadır. Bunlar kurulduktan sonra veri olarak, derlemleri, etiketleri, ağaç yapılarının içinde bulunduğu nltk_data indirilip kurulmalıdır. Bunu python/lib/site-packages/nltk/downloader.py’ i çalıştarak yapıyoruz. Bundan sonrası doğal dil işleme konularına hakim olma ve NLTK modüllerini inceleme gerekiyor. Python komut satırından “import nltk” ile bu aracın genel modüllerini kütüphanemize dahil etmiş oluyoruz. Bundan sonrası altbirimlerin incelenip kullanılmasına kalıyor. Yazılan modüller; derlem okuyucuları, bölüştürücüler, kök çözücüler, etiketleyiciler, kümeleyiciler, ayrıştırıcılar, anlam yorumlayıcılar, sınıflandırıclar, ölçüm, tahmin.

Kurulumu
http://www.nltk.org/download
adresinden verilen işletim sistemleri için kurulum paketleri var. Ben bir GNU/Linux dağıtımı olan Ubuntu üzerinde çalışıtırıyorum. Linux tabanlı işletim sistemlerin çoğunda Python varsayılan olarak yüklüdür. Eğer işletim sisteminizde yüklü değilse http://www.python.org/download/ adresinden 2.5 sürümünü indirerek kurabilirsiniz. Python'un kurulmuş olduğunu varsayarsak geriye NLTK ve Verilerini yüklemek kalıyor.
Windows için;
Hem python hem de nltk için msi kurulum paketleri mevcuttur. Önce Python'u kurup sonra Nltk msi paketini çalıştırdıktan sonra nltk kaynak kodları artık sisteminizde kurulmuştur. Verileri de yüklemek için Python2.5Dizininiz/lib/site-packages/nltk/downloader.py i çalıştırıp "all" seçilip "install" demeniz gerekiyor.
Unix/Linux için;
http://nltk.googlecode.com/files/nltk-0.9.9.zip adresinden kaynak kodlarını indirip, sıkıştırılmış dosyayı açtıktan sonra bu dizin içerisinde komut satırından
sudo python setup.py install
yazmanız yeterli olacaktır. Verileri yüklemeniz içinde
python -m nltk.downloader all
yazmanız gerekmektedir.

6 Mart 2009 Cuma

Doğal Dil İşleme ve Türkçe

Doğal dil, insanlar arasında iletişimi sağlayan sözlü ve yazılı kurallar dizisidir. Günlük konuşma dili olarak da tanımlanabilir. Doğal dil işleme(natural language processing) ise yapay zekâ ve dil biliminin ortak çalışma alanı olan bir araştırma konusudur. Temel amaç bilgisayara doğal dilin kurallarını öğreterek yaptığı analizler ve değerlendirmeler sonucunda anlamlı sonuçlar üretmektir.

Bu amaçla geliştirilen sistemlerin günümüzde birçok kullanım alanı mevcuttur. Doğal dil işlemenin temel hedefleri arasında yazılı metinleri tercüme etmek, dil bilgisi analizi yapmak, metinler içinde yazım yanlışlarını ve hataları bulmak, metinlerin özetlerini çıkarmak gibi konular vardır. Bu aralar herkes google çeviri hizmetini kullanmaya başlamıştır. Deneyelim bakalım translate.google.com : "Ben seni sevdiğimi dünyalara bildirdim" :) sonuç: "I love you, you've communicated to the world" . Dünya ile iletişime geçmişsin bak. Eğer daha iyi bir çeviri yapabileceğine inanıyorsan tercüme edilen cümlenin sağ alt tarafındaki linkten yapabilirsin. Zaten bu da sistemi eğitmeye yardımcı olmanızı sağlayacak ve zamanla daha düzgün tercümeler alacaksınız.

Gelelim dilimizin ne gibi özelliklerinin olduğunu kavramaya. Dili verimli bir şekilde çözümleyebilmek ve bilgisayarın doğal dilde anlama, yorumlama, cevap verme ve/veya tercüme etme kabiliyetini artırmak için işlenen dilin matematiksel modelinin çıkarılması gerekmektedir. İnsan makine iletişimi ancak bu formüller ve kurallar üzerinden sağlanabilir. Algoritmanın dayanak noktaları dilin kurallarıdır. Peki, nelerdir Türkçenin kuralları ya da özellikleri? Dilimizi işleyebilmek için nasıl modelleyebiliriz?

  • Türkçe sadece sözcük bazında kurallı bir dildir. Sözcüklerin oluşturulmasında, eklerin sırasında herhangi bir değişiklik yapılması mümkün değildir. Fakat cümle öğelerinin yerleri konusunda herhangi bir kurala sahip değildir. Bu sebeple sözdizimsel analizi zordur. Resmi yazışmalarda bile dilimizin gene yapısı olan Özne-Nesne-Yüklem sıralamasına kısmen uyulmaktadır. Günlük konuşmalarımızda özneyi çoğu zaman kullanmayız bu işi yükleme bırakırız. Devrik cümle yapısı fazladır ve vurgulanan kısımları yükleme yakın kullanırız. Bu sebeple kurgulanması gereken algoritmaların sayısı fazla olabilir.

  • Kök temellidir ve sondan eklemeli bir dildir. Kök temelli olması anlaşılırlığı yükseltir, sözcüğün genelinden köke inerek anlam çıkarmak artı olarak düşünülebilir. Fakat sondan eklemi bir olması Türkçenin işlenmesinde zorluklar karşımıza çıkarır. Eklenebilecek eklerin çokluğu sözcüğün çözümlenmesini zorlaştırabilir. Ya da eklenen ek sonucunda başka anlama gelen bir sözcük oluşabilir. Abartılmış bir örnek vermemiz gerekirse;
    gözlükçülerdenmiş –
    göz(isim kök)lük(yapım eki)çü(yapım eki)ler(çoğul eki)den(hal eki)miş(çekimli fiil eki)

  • Türkçe fonetiktir, ses harf uyumu vardır, kısacası yazıldığı gibi okunur ve okunduğu gibi yazılır. Metini seslendirme ya da sesli bir konuşmayı metine çeviren sistemler için Türkçe ideal bir dildir.

  • Türkçe eş anlamlı ve sesteş sözcük sayısı fazladır. Türkçedeki kelime sayısının diğer dillere göre az olmasının sebebi de budur. Hem bir kelime ile birçok anlam verebilirsiniz hem de bir sözcük yerine birden fazla kelime kullanabilirsiniz. Türkçenin kurulan bir cümlenin birden fazla yöne çekilmesi ve farklı anlamlara gelebilmesi bu sebeptendir. İşte bu durum doğal dil işlemede önümüze engel olarak çıkmaktadır. Cümlenin analizini doğru yapabilmek için kelimenin hangi anlamda kullanıldığını doğru saptamak gerekmektedir.

Doğal Dil İşlemenin Evreleri

Bölümleme (Tokenization)


Bir metnin incelenebilmesi için öncelikle cümlelere ayrılmış olması gerekir. Bu cümleler ve cümle içindeki kelimelerin çözümlemesi yapıldıktan sonra anlamlı sonuçlar çıkarılabilir. Cümlelere ayırma işlemi metin için konuşmaların, kısaltmaların ve noktalama işaretlerinin geçmesi sebebiyle zorlaşabilir. Metinde ' “Ali çabuk buraya gel!” dedi. ' cümlesini ayırabilmek için noktalama işaretlerinin kontrolünün yapılması gerekecektir. Kullandığımız NLTK aracı bu işi yazılmış kendi (tokenization) kütüphanesi ile yapmaktadır. Buradaki yükümüz üzerimizden kalkmaktadır.

Biçimbirimsel (Morphological) Çözümleme

Sözcüklerin yapısının, ek ve köklerinin incelenmesidir. Türkçe ve Fince gibi sondan eklemeli dillerde daha çok araştırılması gereken bir konudur. Çekim soneklerini çok olması ve yapım eklerinin üretken olması karşımıza engel olarak çıkmaktadır. Örneğin “koyun” kelimesi hangi anlamlara gelebileceğini inceleyelim:

koyun(kök): bir tür hayvan (isim)
koy(kök) – un (iyelik eki): sana ait olan koy(isim)
koy(kök) – un (emir kipi eki): koymak fiilinin emir kipi (fiil)
koyu(kök) –n (iyelik eki): sana ait olan koyu rengi

Cümlede hangi kelimenin kullanılmak istendiğinin bulunması sondan eklemeli dillerde bu sebeple zordur.

Sözdizimsel (Syntaxial) Çözümleme

Cümleyi oluşturan öğelerin hiyerarşik yapı kurallarına uyumunu inceleyerek hangi öbeğe ait olduğunun analizini yapmaktır. Türkçe en genelde özne, nesne ve yüklemden oluşur. Bunun yanında cümlenin anlamını kuvvetlendiren zarf, edat, bağlaçlar da vardır. Wikipedia'ya göre sözdizimsel analizde Türkçe'de şu öğeler kullanılmaktadır.

[1] Simgeler: Ö: özne, D: dolaylı tümleç, Z: zarf tümleci, N: nesne, Y: yüklem, İG: isim grubu, SG: sıfat grubu, İN: isim nesnesi, SN: sıfat nesnesi, DZ: diğer zarflar, S: sıfat, İ: isim, ZB: zaman belirteçleri, T: tamlayan, TN: tamlanan, ZM: zamir, NE: nesne eki, TE: tamlayan eki, TNE: tamlanan eki, KE: kip eki, ZE: zaman eki, DE: dolaylı tümleç eki, EF: ek fiil

[1] tr.wikipedia.org/wiki/Doğal_dil_işleme


Anlamsal (Semantical) Çözümleme

Doğal dil işlemenin son aşamasıdır. İlk dört analiz yapıldıktan sonra cümlenin ne anlama geldiğini çıkarmak için yapılan analizlerdir.

Bağlantılar, Araçlar, Kaynaklar

Doğal dil işlemede kullanılan araçlar. Türkçe için maalesef çalışmalar az. Eşref Hoca'nın başkanlığını yaptığı İTÜ'de doğal dil işleme takımı var. http://ddi.ce.itu.edu.tr/
Javada geliştirilmiş, Open Office eklentileri olan açık kaynak bir proje Zemberek https://zemberek.dev.java.net/

Türkçe için uyarlamaya çalışacağım NLTK projesi hakkında daha sonraları detaylı yazılar yazacağım. www.nltk.org

Doğal dil işleme araçlarının bağlantılarının bulunduğu siteler
http://www.cs.cofc.edu/~manaris/ai-education-repository/nlp-tools.html
http://opennlp.sourceforge.net/projects.html
İngilizce için python ve javada geliştirilmiş bir uyguluma MontyLingua