/*
* Lisans bilgisi icin lutfen proje ana dizinindeki zemberek2-lisans.txt dosyasini okuyunuz.
*/
package net.zemberek.bilgi.araclar;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import net.zemberek.araclar.Kayitci;
import net.zemberek.bilgi.KaynakYukleyici;
import net.zemberek.yapi.Alfabe;
import net.zemberek.yapi.KelimeTipi;
import net.zemberek.yapi.Kok;
import net.zemberek.yapi.Kisaltma;
import net.zemberek.yapi.kok.KokOzelDurumBilgisi;
/**
* BinarySozlukOkuyucu sınıfı düzyazı olarak düzenlenmiş sözlüğü okur.
* Aşağıdaki kod parçası bir binary sözlükteki tüm kökleri okur.
*
* ...
* KokOkuyucu okuyucu = new DuzYaziKokOkuyucu();
* okuyucu.initialize("kaynaklar/kb/duzyazi-kokler.txt");
* Kok kok = null;
* while((kok = sozlukOkuyucu.oku())!= null){
* ekle(kok); // Elde edilen kök nesnesi ile ne gerekiyorsa yap.
* }
* ...
*
*
* @author MDA
*/
public class DuzYaziKokOkuyucu implements KokOkuyucu {
private static Logger log = Kayitci.kayitciUret(DuzYaziKokOkuyucu.class);
private Alfabe alfabe;
private KokOzelDurumBilgisi ozelDurumlar;
protected BufferedReader reader;
private static final Pattern AYIRICI_PATTERN = Pattern.compile("[ ]+");
private Map kokTipAdlari = new HashMap();
// Eger farkli turk dillerine ait kok dosyalarinda farkli turden tip adlari
// kullanildiysa bu isimleri KelimeITplerine esleyen bir Map olusturulup bu
// constructor kullanilabilir. Map icin ornek diger constructor icerisinde
// yer almaktadir.
public DuzYaziKokOkuyucu(String dosyaAdi,
KokOzelDurumBilgisi ozelDurumlar,
Alfabe alfabe,
Map kokTipAdlari) throws IOException {
reader = new KaynakYukleyici("UTF-8").getReader(dosyaAdi);
this.ozelDurumlar = ozelDurumlar;
this.alfabe = alfabe;
this.kokTipAdlari = kokTipAdlari;
}
public List hepsiniOku() throws IOException {
ArrayList list = new ArrayList();
Kok kok;
while ((kok = oku()) != null) {
list.add(kok);
}
if (reader != null)
reader.close();
return list;
}
public Kok oku() throws IOException {
String line;
while (reader.ready()) {
line = reader.readLine().trim();
if (line.startsWith("#") || line.length() == 0) continue;
String tokens[] = AYIRICI_PATTERN.split(line);
if (tokens == null || tokens.length < 2) {
log.warning("Eksik bilgi!" + line);
continue;
}
String asil = tokens[0];
// ayikla() ile kok icerigi kucuk harfe donusturuluyor ve '- vs
// isaretler siliniyor.
String icerik = alfabe.ayikla(asil);
Kok kok;
// kelime tipini belirle. ilk parca mutlaka kok tipini belirler
if (kokTipAdlari.containsKey(tokens[1])) {
KelimeTipi tip = kokTipAdlari.get(tokens[1]);
if (tip == KelimeTipi.KISALTMA)
kok = new Kisaltma(icerik);
else
kok = new Kok(icerik, tip);
ozelDurumlar.kokIcerikIsle(kok, tip, icerik);
} else
throw new IllegalArgumentException("Kok tipi bulunamadi!" + line);
if (!asil.equals(icerik))
kok.setAsil(asil);
// kok ozelliklerini ekle.
ozelDurumlar.duzyaziOzelDurumOku(kok, icerik, tokens);
// bazi ozel durumlar ana dosyada yer almaz, algoritma ile uretilir.
// bu ozel durumlari koke ekle.
ozelDurumlar.ozelDurumBelirle(kok);
return kok;
}
return null;
}
}