[ANASAYFA] [LINUX] [AVUÇİÇİ] [WINDOWS] [WEB] [INTERNET] [BİLGİSAYAR] [ANTİK BİLGİ] [ARAMA]
POPÜLERLER
htmlders
sayisal loto sans topu
elmekyonlen
TDGTW-WarXing
eposta yazim kurallari
BearShare Morpheus ve iMeshi Hizlandirma Yolu
proxy-hiz
komutlar
linux ile windowslari uyutmak
squidle2kat
yedekleme
PDA ve cep telefonu icin www sayfasi yapimi
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.
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