KlavyeMonitor.com    


MENÜ

. ANASAYFA

. KABLOSUZ & TELSİZ

. AVUÇİÇİ & CEP

. LINUX

. WINDOWS

. WEB

. INTERNET

. BİLGİSAYAR

. ANTİK BİLGİ

. ARAMA

. BAĞLANTILAR
. Spam Gönderenler

POPÜLERLER

QR Code Üretici

htmlders

linux kitapları

proxy adresleri kablo

sayisal loto sans topu

elmekyonlen

TDGTW-WarXing

eposta yazim kurallari

BearShare Morpheus ve iMeshi Hizlandirma Yolu

proxy-hiz

komutlar

web hosting hizmetleri

inet-hiz

linux ile windowslari uyutmak

squidle2kat

yedekleme

internet hizi

database oracle mysql sql komutlari

windows mydoom virus

PDA ve cep telefonu icin www sayfasi yapimi


= = =

Favorilere ekle
Google




Semantik Arama ve Ontoloji Bilgi Tabanları İçin Biyografilerden Otomatik Doğum Yeri Saptama

Biyografi metinlerinden ilgili kişinin doğum yeri gibi bilgileri otomatik olarak çıkartabilir ve bunlardan bir veritabanını otomatik oluşturabiliriz.

İnternette çeşitli biyografi siteleri var. Ayrıca Vikipedi, Didikle gibi ansiklopedik web siteleri de pek çok kişinin yaşam öyküsünü barındırıyor. Bu biyografiler çalakalem bir yazı tarzıyla yazıldığından içlerinden yapısal bilgileri yani düzenli yapıdaki verileri otomatik olarak çekmenin pek pratik bir yolu yok. Ancak yine de bu konuda biraz kafa yormak, milyonlarca kişinin verilerini elle tek tek girmekten çok daha pratik.

Bu biyografileri rasgele incelersek, ne kadar standart dışı yazılmış olsalar da belli bir takım şablonlar göze çarpıyor. İşte amacımız bunlardan saptayabildiğimiz kadarını (recall) olabildiğince doğru (precision) bir biçimde bulmak.

Bilgi getirme uygulamalarında precision ve recall denilen bu doğruluk ile kapsanma oranları genelde ilgili bilgi saptama ve/veya bilgisayar öğrenmesi uygulamalarının başarılarını ölçmede kullanılıyor.

Biz burada düzenli ifadelerle (regular expressions / regexp) saptayabildiğmiz kadarını saptamaya çalışacağız. Amacımız bir biyografide geçen şu aşağıdaki şablonlar gibi cümlelerde geçen yer bilgisini saptamak:

XX YYYY yılında X'da doğmuştur.
XX # Kasım YYYY tarihinde X'de dünyaya geldi.
YYYY'da X köyünde doğan XX...
XX X'de doğdu.
... gibi.

Bu yöntemin kapsama oranını arttırmak için çok daha fazla örnek biyografi inceleyerek gözden kaçan şablonları belirlemek işe yarayacaktır.

Doğruluğundan emin olmak da gene kaynak olarak kullanılan biyografi sitelerinin doğruluğu ve yapılarıyla orantılı. Örneğin bir sayfada birden fazla biyografi yer alabilir; bu durumda amaçladığımız dışındaki biyografideki yer bilgisini yanlışlıkla alabiliriz. Ya da kaynak biyografi hatalı olabilir. Doğrulatmak için birden çok kaynaktan yer bilgisini saptamak doğruluk oranını (precision) arttıracaktır.


Doğum Yeri Saptayan PHP Kodu

Web sitelerinde kullanmak isteyenler için PHP scripti biçimiyle kodlayalım. Diyelim ki bir kullanıcı bilim konulu bir web sitesinin arama kutusunda "Feza Gürsey nereli?" diye sordu. Bilim sitesinin arama kodu da "nereli?" anahtar sözcüğünden bunun bir konum sorgusu ilk kısımdaki "Feza Gürsey" anahtar sözcüğünün de bir özel isim olduğunu, ister bir otomatik sınıflandırıcıyla isterse de basit bir veritabanı sorgusuyla saptayıp sorunun bir kişinin doğum yeri ile ilgili olduğunu algıladı ve aşağıdaki kodu çalıştıracak.

Önce bulduğu özel ismi (named entity) bir değişkene atasın:

$kim="Feza Gürsey";

Ardından bunu bir arama motoru sorgusu haline getirip, bir arama motorunda aratıp ilgili biyografinin bulunduğu URL'yi almalı:

//$sorgu="\"".$kim."\" doğdu kim";
$sorgu="\"".$kim."\" doğdu kimkimdir";
$sorgu=str_replace(" ","+",$sorgu);
$sorgu=str_replace("ğ","%C4%9F",$sorgu); //g
$sorgu=str_replace("ı","%C4%B1",$sorgu); //i
$sorgu=str_replace("ş","%C5%9F",$sorgu); //s
$sorgu=str_replace("ğ","%C4%9E",$sorgu); //G
$sorgu=str_replace("ı","%C4%B0",$sorgu); //I
$sorgu=str_replace("ş","%C5%9E",$sorgu); //S
$aurl="http://www.bing.com/search?q=".$sorgu;
$syf=file_get_contents($aurl);
$url="";
if ( preg_match("/<h3><a href=\"(.*)\"/U",$syf,$uveri) ) $url=$uveri[1];
if ( strpos($url,"kimkimdir.gen.tr") !== false ) $url=str_replace("kimkimdir.php","yazdir.php",$url);

Burada Feza Gürsey'le ilgili bir biyografi sayfasını ilk sırada getirtecek biçimde bir sorgu hazırlayıp, Türkçe harfleri uygun biçime çevirip Bing arama motoruna gönderdik. Ardından Bing'in sonuç sayfasındaki ilk url'yi preg_match ile aldık. Bu arada eğer sonucu kimkimdir.gen.tr adresinden getirmişse, bu site bir sayfada başka bir biyografiden de alıntı bulundurduğundan, yanlış veri almamak üzere url'yi düzeltterek, daha sade bir alternatife dönüştürdük.

Şimdi ise bu biyografinin bulunduğu sayfayı çekip,

$isyf=file_get_contents($url);

Eğer bir UTF-8'den ISO-8859-9'a Türkçe harf dönüştürücümüz varsa onu kullanıp,

$isyf=f_tru8tolat5($isyf); // PHP'nin iconv'u hatalı.

f_tru8tolat5 adlı bir fonksiyonu kendiniz yazabilirsiniz.

işlemeye başlayalım:

$yer="";
if ( preg_match("/ ([ÇİÖŞÜA-Z][a-zçğıöşü]*)('d[ae]| köyünde) (doğdu|doğmuştur|doğan|dünyaya geldi|dünyaya gelen)/U",$isyf,$yveri) ) $yer=$yveri[1];
if ( $yer != "" ) echo $kim." ".$yer."'da doğmuştur.\n";

Evet, hepsi bu kadar. Geriye bir tek ekrana yazarken 'da 'de ekini sesli uyumuna göre eklemek kaldı. Onu da kolayca şehrin son hecesine bakarak yapabiliriz. Eğer son hece kalın seslileri, yani a ı o u'yu içeriyorsa 'da, ince seslileri yani e i ö ü'yü içeriyorsa da 'de ekini kullandırtcağız... E hazır elimiz değimişken yapabiliriz:

$ek="da";
if ( preg_match("/[eiöü]/",substr($yer,-2)) ) $ek="de";
if ( $yer != "" ) echo $kim." ".$yer."'".$ek." doğmuştur.\n";

Şimdi hepsini birleştirip bir fonksiyon halinde yazalım:

<?php

function f_nereli($kim) {

$sorgu="\"".$kim."\" doğdu kim";
$sorgu="\"".$kim."\" doğdu kimkimdir";
$sorgu=str_replace(" ","+",$sorgu);
$sorgu=str_replace("ğ","%C4%9F",$sorgu); //g
$sorgu=str_replace("ı","%C4%B1",$sorgu); //i
$sorgu=str_replace("ş","%C5%9F",$sorgu); //s
$sorgu=str_replace("ğ","%C4%9E",$sorgu); //G
$sorgu=str_replace("ı","%C4%B0",$sorgu); //I
$sorgu=str_replace("ş","%C5%9E",$sorgu); //S

$aurl="http://www.bing.com/search?q=".$sorgu;
$syf=file_get_contents($aurl);
$url="";
if ( preg_match("/<h3><a href=\"(.*)\"/U",$syf,$uveri) ) $url=$uveri[1];
if ( strpos($url,"kimkimdir.gen.tr") !== false ) $url=str_replace("kimkimdir.php","yazdir.php",$url);
$isyf=file_get_contents($url);
// $isyf=f_tru8tolat5($isyf); // bu fonksiyona gerek duyacaksiniz.
$yer="";
if ( preg_match("/ ([ÇİÖŞÜA-Z][a-zçğıöşü]*)('d[ae]| köyünde) (doğdu|doğmuştur|doğan|dünyaya geldi|dünyaya gelen)/U",$isyf,$yveri) ) $yer=$yveri[1];
$ek="da";
if ( preg_match("/[eiöü]/",substr($yer,-2)) ) $ek="de";
$sonuc="";
if ( $yer != "" ) $sonuc=$kim." ".$yer."'".$ek." doğmuştur.\n";

return $sonuc;
} // func. sonu
?>

Bunu geliştirerek kapsamını arttırmak ise size kalıyor. Ayrıca regexp'de çok basit bir değişiklikle bu kod bir kişinin doğum yılını, kaç yaşında olduğunu saptamakta da kullanılabilir. Ayrıca gene basit bir değişiklikle serbest biçimde girilmiş biyografiden ilgili kişinin bitirmiş olduğu üniversite vb. gibi diğer veriler de çekilebilir. Hatta, bir biyografiden elde edebileceğiniz bu tür bilgilerin sayısını yeterince arttırdığınızda, bu verileri başka bir dilde otomatik olarak yeniden ifade ettirerek bir otomatik biyografi çeviri programı yazabilirsiniz. Ya da şu Web 3.0, semantik web, web ontolojisi konularına da eğilerek semantik aramalara hazır, yapısal bilgi içeren sistemler oluşturabilirsiniz siz de.


İlker Fıçıcılar
7 Kasım 2011


İlgili Benzer Yazılar:


Arama önerileri: semantik web, semantik arama, web ontolojisi, konum saptama, yer belirleme, web 3.0, veri madenciliği, bilgi tarama,


Kaynak gösterecekler için referans: "Semantik Arama ve Ontoloji Bilgi Tabanları İçin Biyografilerden Otomatik Doğum Yeri Saptama", İlker Fıçıcılar, http://www.KlavyeMonitor.com/Semantik_Arama_ve_Ontolojik_Bilgi_Tabanlari_icin_Biyografilerden_Otomatik_Dogum_Yeri_Saptama.html , Kasım 2011


 
 
 
   
Bu sayfaları Linux'ta oluşturan programı yazan: İlker Fıçıcılar