RSS

Perl ve Prolog ile Doğal Dil İşlemeye Giriş – Allegro CL – Lisp, Prolog ve Kediler

06 Jan

Prolog en başından itibaren dil işlemek için tasarlanmıştı. Sistemle birlikte gelen arama ve birleştirme mekanizmaları formel dilbilim modellerinin şık ve kısa kod yazacak şekilde uygulanmasına olanak tanır. “Definite Clause Grammar” (DCG) ile cümle çözümlemek Prolog içinde arama yapmaya karşılık gelir. Prolog kuralları yükleme esnasında tanır ve bunları yantümcelere çevirir. Böylece Prolog motoru cümle çözümleme işlemini daha fazla program yazmaya gerek kalmadan halleder.

Gerek akademide gerekse piyasadaki pek çok doğal dil işleme sistemi Prolog ile yazılmıştır. Perl, Python, Java veya C++ gibi diller de artık doğal dil işleme mühendisliğinde yaygın olarak kullanılır hale gelmiştir ancak bu dillerde bir fikri ya da dilbilim teorisini uygulamak hala çok kod yazmayı gerektirmektedir. Prolog ise sadece birkaç satır kodlama ile problemin özüne odaklanmayı mümkün kılar. Böylece bizleri işin hamallığından olabildiğince kurtarıp temel kavramları yakalamamızı sağlar.

Pierre M. Nugues‘in “An Introduction to Language Processing with Perl and Prolog – An Outline of Theories, Implementation, and Application with Special Consideration of English, French, and German” kitabının Phrase-Structure Grammars in Prolog başlıklı 8. bölümü yukarıdaki sözlerle açılıyor.

Bilgisayarla doğal dil işleme alanındaki pek çok konuya değinen, 2006 yılında çıkmış bu 500 sayfalık kapsamlı kitap derlem (corpus) oluşturmaktan entropiye, n-gram modellerinden istatistiksel yöntemlere, POS (Part-Of-Speech) etiketlemeden sözdizim çözümlemeye; semantik, söylem ve diyalog modellemeye kadar hemen hemen tüm DDİ kavramlarını ele alıyor. Bu konularla ilgili teorik bilgiler gayet açık, sade ve akıcı bir dille verildikten sonra somut olarak Perl ve Prolog ile somut uygulamalar sunuluyor.

Benim açımdan kitabın faydaları arasında bu aralar üzerinde çalıştığımız projelerden biri olan doğal dil damgalama bağlamında karşıma epey sık çıkan dependency grammar konusunu daha iyi anlamak vardı mesela. Buna ek olarak belki de aklımda en çok kalacak bölümlerden biri de şimdiye dek gördüğüm en güzel “encoding” (Unicode, UTF-8), “locale” ve “collation” kavramlarının, çeşitli karakter setlerinin farklı ortamlarda neye göre sıralama algoritmasına tabi tutulduklarının anlatıldığı kısım. Şimdiye dek gördüğüm en güzel anlatımlardan biri. O kadar hoşuma gitti ki etrafımdaki yazılımcı arkadaşlarıma şu soruyu sormaya başladım:

Bir metin editörü açtınız, 500 karakterlik bir Türkçe yazı (bu 500e boşluk, noktalama, vs. dahil olsun yani 500 tuş vuruşluk) yazdınız, UTF-8 olarak kaydettiniz. Kaç byte yer tutar o dosya?

Henüz ilk seferinde bu soruya doğru cevabı veren biri ile karşılaşmadım (kendim dahil :))

“An Introduction to Language Processing with Perl and Prolog”u, NLP yani Natural Language Processing yani DDİ yani Doğal Dil İşleme ile uğraşan bilgisayarcılara, dilbilimcilere ve hevesli araştırmacılara gönül rahatlığı ile tavsiye edebilirim. Ayrıca bu kitabın bir parçası olduğu Cognitive Technologies serisine genel olarak bakmakta fayda var. Mesela serideki Artificial General Intelligence kitabı bilişsel bilimler, yapay zekâ, vb. konularda çalışan araştırmacılara faydalı olabilecek önemli kitaplardan biri.

Bu arada konu Prolog’dan açılmışken Allegro Common Lisp ile birlikte gelen Prolog motorundan bahsetmemek olmaz tabii!

Oradaki dokümantasyondan yola çıkarak kısa ve eğlenceli bir örnek vermek gerekirse şu Türkçe mantıksal ifadeleri ele alalım:

“Kim Robin’in seviyor. Sandy Lee’yi seviyor. Sandy Kim’i seviyor. Robin kedileri seviyor. Sandy kedileri sevenleri seviyor. Kim Lee’yi seven ve kendisini sevenleri seviyor. Herkes kendi kendisini seviyor.”

Bunları Allegro Common Lisp ortamında Prolog kullanarak kodlayabilmek için:


cg-user(32): (require :prolog)
; Fast loading /home/fz/programming/Lisp/acl80_express/code/prolog.003
t
cg-user(33): (use-package :prolog)
t

Prolog’u devreye sokmak ve ardından satır satır


(< -- (likes Kim Robin))
(<-  (likes Sandy Lee))
(<-  (likes Sandy Kim))
(<-  (likes Robin cats))
(<-  (likes Sandy ?x) (likes ?x cats))
(<-  (likes Kim ?x) (likes ?x Lee) (likes ?x Kim))
(<-  (likes ?x ?x))

verilerini girmek bazı soruları sormak için yeterli olacaktır. Söz gelimi, “Sandy Kim’i seviyor mu?”:


cg-user(49): (?- (likes Sandy Kim))
Yes

Peki, Sandy’nin sevdiği kişiler hangileri (kedileri sevenleri sevdiğini unutmayalım)?:


cg-user(50): (?- (likes Sandy ?x))
?x = Kim

?x = Robin

?x = Sandy

?x = cats

?x =

No.

En genel anlamda hangi insanlar hangi insanları seviyor diye sorup tüm cevapları almak istersek:


cg-user(51): (?- (likes ?x ?y))
?x = Kim
?y = Robin

?x = Sandy
?y = Kim

?x = Robin
?y = cats

?x = Sandy
?y = Robin

?x = Sandy
?y = Sandy

?x = Sandy
?y = cats

?x = Sandy
?y = Sandy

?x = Kim
?y = Sandy

?x = Kim
?y = Sandy

?x =
?y =

?x = Sandy
?y =

No.

Kendime notlar: Allegro CL ile ilgili *locale* ve find-locale‘ye dikkat. Ayrıca XML işleme konusuna biraz daha çalış!

Advertisements
 

One response to “Perl ve Prolog ile Doğal Dil İşlemeye Giriş – Allegro CL – Lisp, Prolog ve Kediler

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: