tr | en
12
Ağu
2011
Türkçe heceleme için XSLT şablonu
Yazar: Yazılım Geliştirme Birimi   |   Kategori: Tekno Kütüphane
Günümüzde genel olarak farklı sistemler arasında standart veri alışverişi gereci olarak kullanılmakla birlikte XML'in ve XSLT'nin asıl gücü yapısal programlamanın en önde gelen hedeflerinden biri olan sunum ile uygulama katmanlarını ayrıştırmayı içerisinde barındırmasıdır. Böylelikle yazılım uzmanları algoritmaların kodlanması ve verilerin saklanması ve yönetilmesi gibi asıl işlerine yoğunlaşırken, verinin kullanıcıya sunumu gibi görsel ağırlıklı işlerin o konunun uzmanları olan grafik sanatçıları tarafından bağımsızca yürütülmesi mümkün kılınır.

Bu makalede uygulama ile gösterimin ayrılmasına örnek olarak ilk kez 1990 yılında SABAH gazetesi için QuarkXPress eklentisi olarak C dili ile kodladığımız Türkçe heceleme algoritmasının XSLT şablonu şeklinde kodlanmasını anlatacağız.

Herhangi bir metinin veritabanından çekilerek kullanıcıya sunulmak üzere hazır hale getirilmesi yazılımcının görevi iken, bu metnin sayfanın hangi kısmında, ne renkte kaç puntoda ve hecelere ayrılıp ayrılmadan gösterileceği gibi kulanıcıya sunumuna yönelik hazırlanması ise grafiker tarafından ve yazılımcıya hiçbir şekilde bağımlı kalmaksızın yapılabilmelidir.

Bu makalede bir Türkçe metnin hecelenerek kullanıcıya sunulması için herhangi bir uyglama geliştirme dili kullanımını gerektirmeyecek şekilde salt XSLT ile nasıl hecelere ayrılabileceğini göreceğiz.

XSLT'nin anlaşılır olması için aşağıdaki varsayımları yapıyoruz:

  • Hecelenecek metin hiçbir noktalama karakteri içermiyor (bu amaçla translate() işlevi kullanılabilir.)
  • Metin içerisinde geçen sözcükler birer boşluk (' ') karakteri ile ayrılmış durumda (bu normalize-space() işlevi ile kolaylıkla sağlanabilir)

Öncelikle gelen metnin gösterilmeden önce sözcüklere ayrırarak her bir sözcüğü ayrı ayrı hecelememiz gerekiyor. Bu amaçla aşağıdaki metin-hecele XSLT şablonunu hecelenecek metni $metin parametresi içerisinde geçirerek kullanıyoruz.:

<xsl:template name="metin-hecele">
<xsl:param name="metin"/>
<xsl:choose>
  <xsl:when test="contains($metin,' ')">
   <xsl:call-template name="he-ce-le">
    <xsl:with-param name="sozcuk" select="substring-before($metin,' ')"/>
   </xsl:call-template>
   <xsl:text> </xsl:text>
   <xsl:call-template name="metin-hecele">
    <xsl:with-param name="metin" select="substring-after($metin,' ')"/>
   </xsl:call-template>
   </xsl:when>
   <xsl:otherwise>
    <xsl:call-template name="he-ce-le">
     <xsl:with-param name="sozcuk" select="$metin"/>
    </xsl:call-template>
  </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Yukarıdaki şablon, metni sözcüklere ayırarak her bir sözcüğün he-ce-le adlı şablon aracılığıyla hecelenmesini sağlar.

Türkçe heceleme için kullandığımız algoritma temel olarak sessiz harfler arasındaki sesli harf sayısını ve sözcük içerisindeki r harfinin konumunu kullanarak sözcüğü heceleyeceği yeri belirliyor.

Bu harfleri kolaylıkla bulabilmek için gelen sözcük içerisindeki tüm sessiz harfleri a harfine ve büyük r harfini küçük r harfine çevirerek yeni bir değişken içerisine ($ozel) yazıyoruz. Ayrıca heceleri ayırmak için tire ("soft hyphen") damgası olarak &#173; karakterini kullanıyoruz.

Sessiz harfler arasındaki sesli harf sayısı için  $say değişkenini kullanıyoruz.

Algoritma şöyle çalışıyor:

  1. Eğer sessiz harfler arasındaki sesli harf sayısı 0 ya da 1 ise ilk sessiz harften hemen sonra tire ekliyoruz.
  2. Eğer sessiz harfler arasındaki sesli harf sayısı 3 ise ve 3. sesli harf r ise 1. sesli harften hemen sonra tire ekliyoruz.
  3. Diğer durumlarda sesli harflerin tam ortasına tire ekliyoruz.
  4. Heceleme işlemine tire eklediğimiz son noktadan devam ediyoruz.

Yukarıdaki algoritmayı uyguladığımız he-ce-le adlı şablon aşağıdadır:

<xsl:template name="he-ce-le">
<xsl:param name="sozcuk"/>
<xsl:param name="tire" select="'&#173;'"/>

 <xsl:variable name="ozel" select="translate($sozcuk, 'aeıioöuüAEIİOÖUÜR','aaaaaaaaaaaaaaaar')"/>

 <xsl:variable name="a" select="substring($sozcuk, 1 ,string-length(substring-before($ozel,'a'))+1)"/>
<xsl:variable name="bo" select="substring($ozel,string-length($a)+1)"/>
<xsl:variable name="b" select="substring($sozcuk,string-length($a)+1)"/>
<xsl:variable name="c" select="substring-before($bo,'a')"/>
<xsl:variable name="say" select="string-length($c)"/>
<xsl:choose>
  <xsl:when test="not(contains($bo,'a'))">
   <xsl:value-of select="$sozcuk"/>
  </xsl:when>
  <xsl:when test="$say=0 or $say=1">
   <xsl:value-of select="concat($a,$tire)" disable-output-escaping="yes"/>
   <xsl:call-template name="sonrasi">
    <xsl:with-param name="sozcuk" select="$b"/>
   </xsl:call-template>
  </xsl:when>
  <xsl:when test="$say=3 and substring($bo,3,1)='r'">
   <xsl:value-of select="concat($a,substring($c,1,1),$tire)" disable-output-escaping="yes"/>
   <xsl:call-template name="sonrasi">
    <xsl:with-param name="sozcuk" select="substring($b,2)"/>
   </xsl:call-template>
  </xsl:when>
  <xsl:otherwise>
   <xsl:variable name="yer" select="ceiling( $say div 2)"/>
   <xsl:value-of select="concat($a,substring($c,1,$yer),$tire)" disable-output-escaping="yes"/>
   <xsl:call-template name="sonrasi">
    <xsl:with-param name="sozcuk" select="substring($b,$yer + 1)"/>
   </xsl:call-template>
  </xsl:otherwise>
</xsl:choose>
</xsl:template>

<xsl:template name="sonrasi">
<xsl:param name="sozcuk"/>
<xsl:variable name="ozel" select="translate($sozcuk, 'aeıioöuüAEIİOÖUÜ','aaaaaaaaaaaaaaaa')"/>
<xsl:choose>
  <xsl:when test="contains($ozel,'a')">
   <xsl:call-template name="he-ce-le">
    <xsl:with-param name="sozcuk" select="$sozcuk"/>
   </xsl:call-template>
  </xsl:when>
  <xsl:otherwise>
   <xsl:value-of select="$sozcuk"/>
  </xsl:otherwise>
</xsl:choose>
</xsl:template>

Yorum Ekle (giriş yapın)