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
|