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();