Veri

Java ile Sözcüğü Hecelere Ayırma ve Hece Sayısını Bulma

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();
zafer.teker , 13.03.2022

Bu Sayfayı Paylaş:

Fibiler Üyelerinin Yorumları


Tüm üyeler içeriklere yorum ekleyerek katkıda bulunabilir : Yorum Gir

Misafir Yorumları




Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir