Türkiye Türkçesinde Türkçe kökenli sözcükler için olabilecek hece tipleri aşağıdaki gibidir :
- V : a, ı, e
- CV : de, ye, ki, ve, su
- VC : at, ak, iş, ok, el
- CVC : tut, gel, kal, taş, baş, kuş
- VCC : ört, ürk, alt
- CVCC : dört, kalk, Türk
V (Vowel) ünlü, C (Consonant) ünsüz anlamında kullanılmaktadır.
Yabancı dilden gelen bazı sözcükler yukarıdaki hece yapısına uymayabilir : saat, tren, bandrol, santral vb.. Ancak Türkçe söylenişte uymaya zorlayabilir : saat>sağat, tren>tiren, bandrol>bandırol gibi.
Sözcüklere gelen ekler de yukarıdaki hece tiplerinde olmaktadır veya eklendiği sözcüğün hecesine katılır:
- C : erit (eri-t), dert-leş (dert-le-ş)
- V : ev-e, iş-e, yaş-a
- CV : de-di, ye-di, su-la
- VC : at-ış, ak-ıt, iş-et, ok-ur, el-er
- CVC : tut-muş, gel-mek, kal-mak, taş-lık, baş-lık, kuş-tan
- CVCC : okut-turt (oku-t-tur-t), sevin-dirt (sev-in-dir-t)
-mtrak (sarımtrak, acımtrak) eki kuralı bozmaktadır. sarımtrak = sa-rım-trak şeklinde Türkçe'de olmayan trak yapısındadır.
Türkçe için hecelere ayırma algoritması şu şekildedir. Verilen metnin son ünlüsü tespit edilir. Bu ünlüden önceki ünsüz ise o ünsüz dahil edilerek sözcük sonuna kadar hece kabul edilir ve bir listeye eklenir. Eklenen heceden geri kalan sözcük için tekrar aynı yöntem uygulanır. Elde ünlü kalmayan son durum da hece listesine eklenir. En son da eklenen liste tersine çevrilir. Basit bir uygulama aşağıdaki gibidir :
public void parse(String text) {
syllable=new ArrayList<String>();
syllable(text);
Collections.reverse(syllable);
}
void syllable(String text) {
if(text==null||text.isEmpty()) {
return;
}
int lastIndex=TurkishLanguage.findLastVowelIndex(text);
if(lastIndex>0) {
if(TurkishLanguage.isVowel(text.charAt(lastIndex-1))) {
syllable.add(text.substring(lastIndex));
syllable(text.substring(0,lastIndex));
}else {
syllable.add(text.substring(lastIndex-1));
syllable(text.substring(0,lastIndex-1));
}
}else {
syllable.add(text);
return;
}
}
TurkishLanguage.findLastVowelIndex yöntemi son ünlünün index'ini veren bir yöntemdir :
public static Character findLastVowel(String word) {
for (int i = word.length() - 1; i >= 0; i--) {
char c = word.charAt(i);
if (TurkishLanguage.isVowel(c)) {
return c;
}
}
return null;
}
TurkishLanguage.isVowel(c) ile bir karakter ünlü mü değil mi döndüren basit bir yöntemdir.
Örneğimizde son bir ünlü metni içinde var ise bir önceki ses ünlü ise ünlüyü dahil edip en sona kadar kısmı alıyoruz ve hece listesine ekliyor. Geri kalan metni sürece devam etmesi için aynı yönteme yönlendiriyoruz. Eğer son ünlüden önceki ünsüz ise bu ünsüz dahil ederek heceyi alıyoruz ve geri kalanı yine aynı yönteme yönlendiriyoruz. syllable listesi parçalanan heceleri tutan bir liste. Süreç bittikten sonra bu liste ters çevrildiğinde heceler doğru sırada verilmiş olunur.
Aşağıdaki gibi basit testler yapılarak doğrulanabilir :
@Test
public void parseTest() {
String text="katanlardan";
SyllableParser parser=new SyllableParser();
parser.parse(text);
System.out.println(parser.getSyllable());
}
Çıktı aşağıdaki gibi olacaktır :
[ka, tan, lar, dan]
Bu yöntem tren gibi, sarımtrak, elektrik, spor gibi sözcüklerde işe yaramamaktadır. Bu yöntem yerine daha gelişmiş bir yöntem gerekir.
Hece sayısı ise bir sözcükteki ünlü sesleri sayarak yapılabilir. Sadece saat, babaanne gibi iki ünlünün yan yana geldiği örneklerde değeri vermez.
public int getCountSyllable(String text) {
Pattern p = Pattern.compile("[aAeEiİıIoOöÖuUüÜâÂûÛîÎ]", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Matcher m = p.matcher(text);
int i=0;
while (m.find()) {
i++;
}
return i;
}
Java 9 ve sonrası için döngü açıp saymak yerine aşağıdaki gibi bulunabilir:
int count=(int) m.results().count();
Türkiye Türkçesinde Türkçe kökenli sözcükler için olabilecek hece tipleri aşağıdaki gibidir :
- V : a, ı, e
- CV : de, ye, ki, ve, su
- VC : at, ak, iş, ok, el
- CVC : tut, gel, kal, taş, baş, kuş
- VCC : ört, ürk, alt
- CVCC : dört, kalk, Türk
V (Vowel) ünlü, C (Consonant) ünsüz anlamında kullanılmaktadır.
Türkçe'de iki heceli sözcüklerde bu durumda aşağıdaki gibi olabilirler :
- VCV : ile, ata
- VCVC : odun, atıl
- VCCV : örtü, elti
- CVCV : sana, soru
- VCVCC : oturt, aşırt
- VCCVC : örtün, ürküt
- CVCVC : ağlaş, anlat
- CVCCV : bağla, zurna
- VCCCV : örtme, ürktü
- VCCVCC : artırt, incelt
- CVCVCC : dedirt, yedirt
- CVCCVC : kalkar, dörder
- VCCCVC : örttük, ürktün
- CVCCCV : sürttü, dürttü
- CVCCVCC : sürdürt, güldürt
- VCCCVCC : ölçtürt, örttürt
- CVCCCVC : kalkmış, dörttür
- CVCCCVCC : çarptırt, sürttürt
Üç heceli ise aşağıdaki şekillerde olabilir. Ancak bazıları için örnek bir sözcük olmayabilir :
- VCVCV
- VCVCVC
- VCVCCV
- VCCVCV
- CVCVCV
- VCVCVCC
- VCVCCVC
- VCVCCCV
- VCCVCVC
- VCCVCCV
- CVCVCVC
- CVCVCCV
- CVCCVCV
- VCCCVCV
- VCVCCVCC
- VCVCCCVC
- VCCVCVCC
- VCCVCCVC
- VCCVCCCV
- CVCVCVCC
- CVCVCCVC
- CVCVCCCV
- CVCCVCVC
- CVCCVCCV
- VCCCVCVC
- VCCCVCCV
- CVCCCVCV
- VCVCCCVCC
- VCCVCCVCC
- VCCVCCCVC
- CVCVCCVCC
- CVCVCCCVC
- CVCCVCVCC
- CVCCVCCVC
- CVCCVCCCV
- VCCCVCVCC
- VCCCVCCVC
- VCCCVCCCV
- CVCCCVCVC
- CVCCCVCCV
- VCCVCCCVCC
- CVCVCCCVCC
- CVCCVCCVCC
- CVCCVCCCVC
- VCCCVCCVCC
- VCCCVCCCVC
- CVCCCVCVCC
- CVCCCVCCVC
- CVCCCVCCCV
- CVCCVCCCVCC
- VCCCVCCCVCC
- CVCCCVCCVCC
- CVCCCVCCCVC
- CVCCCVCCCVCC
dört heceli şekiller de aşağıdaki gibi olabilir:
- VCVCVCV
- VCVCVCVC
- VCVCVCCV
- VCVCCVCV
- VCCVCVCV
- CVCVCVCV
- VCVCVCVCC
- VCVCVCCVC
- VCVCVCCCV
- VCVCCVCVC
- VCVCCVCCV
- VCVCCCVCV
- VCCVCVCVC
- VCCVCVCCV
- VCCVCCVCV
- CVCVCVCVC
- CVCVCVCCV
- CVCVCCVCV
- CVCCVCVCV
- VCCCVCVCV
- VCVCVCCVCC
- VCVCVCCCVC
- VCVCCVCVCC
- VCVCCVCCVC
- VCVCCVCCCV
- VCVCCCVCVC
- VCVCCCVCCV
- VCCVCVCVCC
- VCCVCVCCVC
- VCCVCVCCCV
- VCCVCCVCVC
- VCCVCCVCCV
- VCCVCCCVCV
- CVCVCVCVCC
- CVCVCVCCVC
- CVCVCVCCCV
- CVCVCCVCVC
- CVCVCCVCCV
- CVCVCCCVCV
- CVCCVCVCVC
- CVCCVCVCCV
- CVCCVCCVCV
- VCCCVCVCVC
- VCCCVCVCCV
- VCCCVCCVCV
- CVCCCVCVCV
- VCVCVCCCVCC
- VCVCCVCCVCC
- VCVCCVCCCVC
- VCVCCCVCVCC
- VCVCCCVCCVC
- VCVCCCVCCCV
- VCCVCVCCVCC
- VCCVCVCCCVC
- VCCVCCVCVCC
- VCCVCCVCCVC
- VCCVCCVCCCV
- VCCVCCCVCVC
- VCCVCCCVCCV
- CVCVCVCCVCC
- CVCVCVCCCVC
- CVCVCCVCVCC
- CVCVCCVCCVC
- CVCVCCVCCCV
- CVCVCCCVCVC
- CVCVCCCVCCV
- CVCCVCVCVCC
- CVCCVCVCCVC
- CVCCVCVCCCV
- CVCCVCCVCVC
- CVCCVCCVCCV
- CVCCVCCCVCV
- VCCCVCVCVCC
- VCCCVCVCCVC
- VCCCVCVCCCV
- VCCCVCCVCVC
- VCCCVCCVCCV
- VCCCVCCCVCV
- CVCCCVCVCVC
- CVCCCVCVCCV
- CVCCCVCCVCV
- VCVCCVCCCVCC
- VCVCCCVCCVCC
- VCVCCCVCCCVC
- VCCVCVCCCVCC
- VCCVCCVCCVCC
- VCCVCCVCCCVC
- VCCVCCCVCVCC
- VCCVCCCVCCVC
- VCCVCCCVCCCV
- CVCVCVCCCVCC
- CVCVCCVCCVCC
- CVCVCCVCCCVC
- CVCVCCCVCVCC
- CVCVCCCVCCVC
- CVCVCCCVCCCV
- CVCCVCVCCVCC
- CVCCVCVCCCVC
- CVCCVCCVCVCC
- CVCCVCCVCCVC
- CVCCVCCVCCCV
- CVCCVCCCVCVC
- CVCCVCCCVCCV
- VCCCVCVCCVCC
- VCCCVCVCCCVC
- VCCCVCCVCVCC
- VCCCVCCVCCVC
- VCCCVCCVCCCV
- VCCCVCCCVCVC
- VCCCVCCCVCCV
- CVCCCVCVCVCC
- CVCCCVCVCCVC
- CVCCCVCVCCCV
- CVCCCVCCVCVC
- CVCCCVCCVCCV
- CVCCCVCCCVCV
- VCVCCCVCCCVCC
- VCCVCCVCCCVCC
- VCCVCCCVCCVCC
- VCCVCCCVCCCVC
- CVCVCCVCCCVCC
- CVCVCCCVCCVCC
- CVCVCCCVCCCVC
- CVCCVCVCCCVCC
- CVCCVCCVCCVCC
- CVCCVCCVCCCVC
- CVCCVCCCVCVCC
- CVCCVCCCVCCVC
- CVCCVCCCVCCCV
- VCCCVCVCCCVCC
- VCCCVCCVCCVCC
- VCCCVCCVCCCVC
- VCCCVCCCVCVCC
- VCCCVCCCVCCVC
- VCCCVCCCVCCCV
- CVCCCVCVCCVCC
- CVCCCVCVCCCVC
- CVCCCVCCVCVCC
- CVCCCVCCVCCVC
- CVCCCVCCVCCCV
- CVCCCVCCCVCVC
- CVCCCVCCCVCCV
- VCCVCCCVCCCVCC
- CVCVCCCVCCCVCC
- CVCCVCCVCCCVCC
- CVCCVCCCVCCVCC
- CVCCVCCCVCCCVC
- VCCCVCCVCCCVCC
- VCCCVCCCVCCVCC
- VCCCVCCCVCCCVC
- CVCCCVCVCCCVCC
- CVCCCVCCVCCVCC
- CVCCCVCCVCCCVC
- CVCCCVCCCVCVCC
- CVCCCVCCCVCCVC
- CVCCCVCCCVCCCV
- CVCCVCCCVCCCVCC
- VCCCVCCCVCCCVCC
- CVCCCVCCVCCCVCC
- CVCCCVCCCVCCVCC
- CVCCCVCCCVCCCVC
- CVCCCVCCCVCCCVCC