Doğal Dil İşleme (Natural Language Processing) (NLP)

Amacımız "Bir web sayfasından doğal dil ile girilen soru cümlesini alarak, elimizdeki ontolojiye göre uygun yanıtı veren bir sistem" geliştirmekti. Önceden yapılmış çalışmalara örnek olarak aşağıdaki bağlantılardaki dökümanları inceleyebiliriz:

A Natural Language Query Interface to Structured Information

AquaLog An Ontology Portable Question Answering System

Ginseng projesi

Querying the Semantic Web with Ginseng

Querix A Natural Language Interface to Query Ontologies


İlk aşamada kullanıcının sorduğu soruyu içerdiği kelimelere göre işleyebilen bir algoritmaya ihtiyacımız olacak. Bu amaçla genel adıyla Natural Language Processing (NLP) olarak anılan ve dilin gramer yapısına göre değişiklik gösterebilen yöntemler kullanılabilir.

Biz basitçe cümleyi önceden belirlediğimiz anahtar kelimeleri arayarak ve geri kalan kelimeleri ontolojimiz içinde sorgulayarak sonuç döndüren bir yapı kurmaya çalışacağız. Öncelikle soru ya da cümle yapısını belirlememizi sağlayacak olan Kim, Kaç, Nerede, Ne zaman gibi anahtar kelimeleri ayırdetmemiz gerekir. Bu anahtar kelimeler, bağlaçlar v.s. dışında kalan kelimeler bizim için ontoloji içinde aranacak değerleri oluşturacaktır.


-->
if (question.toLowerCase().indexOf("what ") > -1)
questionType = "WHAT";
else if (question.toLowerCase().indexOf("which ") > -1)
questionType = "WHICH";
else if (question.toLowerCase().indexOf("who ") > -1)
questionType = "WHO";
else if (question.toLowerCase().indexOf("when ") > -1)
questionType = "WHEN";
else if (question.toLowerCase().indexOf("how many") > -1)
questionType = "HOWMANY";
//Look for max - min words
if (question.toLowerCase().indexOf(" max ") > -1)
checkMinMax = "MAX";
else if (question.toLowerCase().indexOf(" maximum ") > -1)
checkMinMax = "MAX";
else if (question.toLowerCase().indexOf(" min ") > -1)
checkMinMax = "MIN";
else if (question.toLowerCase().indexOf(" minimum ") > -1)
checkMinMax = "MIN";
//Look for has/is words
if (question.toLowerCase().indexOf(" has ") > -1 || question.toUpperCase().indexOf(" HAVE ") > -1)
checkHasIs = "HAS";
if (question.toLowerCase().indexOf(" is ") > -1)
checkHasIs = "IS";
if (question.toLowerCase().indexOf(" same ") > -1)
checkEquality = "YES";
if (question.toLowerCase().indexOf(" similar ") > -1)
checkEquality = "YES";

Örnek çalışmamızda soruların ingilizce sorulması isteniyordu. Soruyu kelime kelime incelerken anahtar olarak belirlediğimiz kelimeleri tarayıp, işimize yarayacak olanları aldıktan sonra temizleriz.


-->
temp = temp.replaceAll(" of ", " ");
temp = temp.replaceAll(" is ", " ");
temp = temp.replaceAll(" am ", " ");
temp = temp.replaceAll(" are ", " ");
temp = temp.replaceAll(" was ", " ");
temp = temp.replaceAll(" were ", " ");
temp = temp.replaceAll("who ", " ");
temp = temp.replaceAll("Who ", " ");
temp = temp.replaceAll("what ", " ");
temp = temp.replaceAll("when ", " ");
temp = temp.replaceAll("which ", " ");
temp = temp.replaceAll("how many", "");
temp = temp.replaceAll("how much", "");
temp = temp.replaceAll("many ", " ");
temp = temp.replaceAll("much ", " ");
temp = temp.replaceAll("why ", " ");
temp = temp.replaceAll("where ", " ");
temp = temp.replaceAll("has ", " ");
temp = temp.replaceAll("have ", " ");

Geriye kalan kelimeler bizim için veri sorgulamada kullanılacak değerler olacaktır.

OWL - Web Ontoloji Dili

Web Ontology Language (OWL), ontolojileri tanımlamak ve çeşitlemek için kullanılan bir dildir. Bir ontoloji, ilgili özellikler ve örnekleri ile birlikte sınıfların açıklamalarını içerebilir. OWL, bilginin içeriğini sadece insanlara gösteren değil, bunun yanında işleyen uygulamalar tarafından kullanılmak üzere tasarlanmıştır.OWL, XML, RDF, and RDF Schema (RDF-S) tarafından desteklenen web içeriğinin makinalar tarafından daha iyi yorumlanabilmesini, biçimsel bir semantik ile birlikte ek sözcük kümeleri sunarak kolaylaştırır.OWL, OIL ve DAML+OIL gibi eski dilleri temel alır, ve şu anda W3C tavsiyesidir.

OWL, Semantic Web'in gelecekteki uygulamaları için temel teknolojilerden biridir. Sayıca çok ve çeşitli alanlardaki uygulamalarda önemli bir rol oynamaktadır, ve araştırmalarını araçlara, uslamlama tekniklerine, biçimsel temellere ve dil eklentilerine odaklamıştır. (Kaynak)

İlgili bağlantılar:
Introduction to OWL

OWL Web Ontology Language

OWL Belgesi Hazırlama

A Practical Guide To Building OWL Ontologies Using The Protégé-OWL

Jena ve SPARQL ile owl / rdf ontoloji dosyaları üzerinde çalışmak

Ontolojiler ile ilgili çalışmalar yapılıyor ve pek çok döküman bulabiliyoruz. Buna karşın bu konu üzerinde araştırırken baştan sona bir referans bulamadım.

Basit bir Doğal dil işleyici(NLP) geliştirip, oluşturacağımız ontoloji ile ilgili sorulacak olan sorulara, bu ontoloji üzerinden SPARQL kullanarak yanıt verebilecek bir yazılım Hangi adımları hangi araçlarla gerçekleştirmemiz gerektiğini bulmak uzunca vakit aldı, Türkçe kaynakların azlığı da bir başka sorun...

Benzer çalışmalar yapacak arkadaşlara yardımcı olması açısından öğrendiklerimi adım adım yazmaya çalışacağım.

Geliştirmek istediğimiz yazılım en basit hali ile; “bir web sayfasından doğal dil ile girilen soru cümlesini alarak, elimizdeki ontolojiye göre uygun yanıtı veren bir sistem” olmalı.

Bu amaçla inceleyeceğimiz konular şöyle olacak:


  • OWL
  • Natural Language Processing(NLP)
  • Generic Question Templates(GQT)
  • Ontology Mapping
  • -Protege
  • SPARQL ve ARQ
  • -WordNet
  • Inference ve Reasoner
  • -Generic Rule Reasoner
    -Rule tanımlama, .rules dosyası

Almanya ve Avrupa'da GPL'in Durumu

Bir çok mahkeme kararıyla GPL'in lisans şartları başarılı bir şekilde mecburi hale getirildi. Özellikle gömülü sistemler alanı bu tip uygunluk etkinlikleri için odak noktasında. GPL ihlallerine yönelik mahkemelerde de GPL'in şartlarını sağlama zorunluluğu çıkıyor. Bu nedenle Almanya ve Avrupa'da GPL uyumlu ürünlerin sayısı artıyor. Konuyla ilgili ayrıntılı bir makaleye Groklaw - Enforcement of the GNU GPL in Germany and Europe, by Till Jaeger adresinden ulaşabilirsiniz.

Cahit Arf Yazılımı

Cahir Arf ismini bilenler başlığa biraz şaşırabilir. Cahit Arf bir matematikçi, bilgisayar dünyasıyla ne ilgisi olabilir denilebilir. Başka Cahit Arf mı var? diye sorulabilir. Yok, hani 10 liraların arkasında gördüğümüz Cahit Arf'ten bahsediyorum. Yani kendi adıyla anılan matematik terimleri, kuramları olan dünyaca tanınan matematikçi Cahit Arf'ten.
Gerçekten de Cahit Arf adında bir yazılım var. Weka adlı veri madenciliği yazılımı için ilişkisel veri tabanlarından ve ARFF dosyalarından veri çıkarılmasına yardımcı oluyor bu yazılım. LGPL lisansıyla yazılan bu yazılıma neden Cahit Arf  adı verildiğini bilmiyorum; ama hoşuma gitti.

OpenOffice Writer'da Bağlantılı Dizin Oluşturma

Birçok kişi rapor, tez vb. hazırlarken belgenin içindekiler veya kaynaklar kısmını oluşturmak için zorlanmıştır. En azından ben birçok kere zorlandım. Ofis yazılımlarının bunu otomatik olarak yapabildiğini öğrendiğimde çok sevinmiştim. Çünkü başlıkları bulup bunları alt alta yazmaya çalışıyordum içindekiler bölümünü oluşturmak için. Bu yüzden birçok kişi bu yazılımların otomatik dizin oluşturma özelliğini zaten kullanıyordur; ama yine de en azından benim gibi bu konuda muzdarip olanlar için paylaşayım dedim.
OpenOffice Writer'da içindekiler bölümünü oluşturmak için öncelikle dikkat edilmesi gereken başlıkların biçimlendirmesinin başlık tiplerinden biri olması: Örneğin; ana başlıklar başlık 1(header 1), alt başlıklar başlık 2(header 2), ve daha küçük başlıklar başlık 3(header 3)...
Başlık düzeylerine göre başlıklar oluşturulduktan sonra dizini koymak istediğimiz yere tıklayarak Ekle menüsünün, Dizinler ve Tablolar kısmından Dizinler ve Tablolar'ı seçiyoruz. Karşımıza çıkan pencere oluşturacağımız dizinle ilgili özellikleri belirlememizi sağlıyor. Bağlantılı dizin oluşturmamız için Girişler tabında bazı değişiklikler yapmamız gerekiyor. Yapı denilen bölümde E# ile gösterilen bölüm numarasını seçip Köprü(Hyperlink)'ye tıklıyoruz. Karakter biçemini de Sayfa Numarası olarak seçiyoruz.   Ve yine Yapı denilen bölümden en sondaki Sayfa numarası(#)nı seçip yine Köprüye tıklıyoruz. Yaptıklarımızın tüm başlık düzeylerini etkilemesi için de Hepsi butonunu tıklıyoruz. Tamam dediğimizde dizin-içindekiler bölümümüz eklenecektir. Önemli bir nokta belgede herhangi bir değişiklik yapıldığında dizinin güncellenmesi gerektiği. Bunun için o bölüme gelip fareye sağ tıklayarak Dizin/Tablo Güncelle diyoruz.  Bağlantılı dizin özelliği PDF'ye çevirdiğimizde de işe yarayacaktır. Yani PDF dosyamızda da belge içindeki başlıklara bağlantı kuran bir dizinimiz olacaktır.

Yararlandığım Kaynak: How to: Create a linked index with OpenOffice