2012-01-14 3 views
-2

Можно создать дубликат:
Detecting syllables in a wordКак разбить предложение на слоги в Java

Предположим, что входная строка «Сая sedang макан наси горенг» Я хочу, чтобы разбить его на слоги : «sa», «ya», «se», «dang», «ma», «kan», «na», «si», «go», «reng»

Как это сделать в Java? может кто-нибудь мне помочь?

+1

Я думаю, что это проблема определения формальных правил того, что составляет слог на индонезийском языке, а не проблемы программирования. После того, как вы определили формальные правила, программирование должно быть * тривиальным *. –

+0

Хорошее место для запуска: http: // stackoverflow.com/questions/405161/detecting-syllables-in-a-word –

+0

@KlausByskovHoffmann Программа * может быть тривиальной, но словарь, который ему нужен, может быть довольно большим :) – dasblinkenlight

ответ

1

Это непростая вещь. Но, если вы все еще хотите это сделать, я думаю, что ваш лучший выбор - поиск базы данных словаря (которая дает вам разбиение слога для каждого слова, хотя это трудно найти), загрузить его и написать программу для запроса базы данных и получить срыв слога.

0

Вот наивная решение:

String input = "saya sedang makan nasi goreng"; 
Matcher m = Pattern.compile("[^aeiou]?[AEIOUaeiou](ng|n)?").matcher(input); 
int s = 0; 
while (m.find()) { 
    System.out.println(input.substring(s, m.end()).trim()); 
    s = m.end(); 
} 

Edit:
@Stephen C прав. Вот правильное решение, основанное на слог правил формирования индонезийского языка (от source)

В индонезийском слоге состоит из гласной плюс сразу precending согласными. Он также включает любой следующий согласный, что не сразу предшествует следующей гласной.

Отметьте, что ng считается единственным согласным.

String input = "SAYA sedang makan nasi goreng garam asal saat air ia bentuk"; 
Matcher m = Pattern.compile("[^aeiou]?[aeiou]((ng|[^aeiou])(?![aeiou]))?", 
       Pattern.CASE_INSENSITIVE).matcher(input); 
int s = 0; 
while (m.find()) { 
    System.out.println(input.substring(s, m.end()).trim()); 
    s = m.end(); 
} 

Пожалуйста, обратите внимание, что (также упоминается в приведенном выше источнике) слогов, как они выражены в речи может слегка отличаться, например, in-speech: ma-kan-a, программный выход: ma-ka-nan.

Редакция 2: ОК. Дальнейшее изучение показало, что я пропустил ny, sy и kh согласные. Также исправлена ​​пара других проблем. Вот обновленное регулярное выражение:

"(ng|ny|sy|kh|[^aeiou])?[aeiou]((ng|ny|sy|kh|([^aeiou](?![gyh]))(?![aeiou])))?" 
+0

наивное решение такой проблемы, вероятно, не является решением. –

+0

Мой плохой. Посмотрите обновление для лучшей попытки :) – rodion

Смежные вопросы