可能重复:
检测单词中的音节
假设输入字符串是“saya saintg makan nasi goreng” 我想把它分成音节:“sa”、“ya”、“se”、“dang”、“ma”、“kan”、“na”、“si ”、“去”、“任”
我怎样才能在Java中做到这一点?有人可以帮助我吗?
如果没有语音输入,您需要一个“音节词典”来做到这一点。
编辑:已经在这个网站上讨论过。
这不是一件容易的事。但是,如果您仍然想这样做,我认为您最好的选择是搜索字典数据库(它为您提供每个单词的音节细分,虽然这很难找到),下载它并编写一个程序来查询数据库并获取音节分解。
这是一个天真的解决方案:
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();
}
编辑:
@Stephen C 是对的。这是基于印度尼西亚语的音节形成规则的适当解决方案(来自源)
在印尼语中,音节由元音加上紧接在前的辅音组成。它还包括任何不紧跟在下一个元音之前的辅音。
请注意,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();
}
请注意(在上面的来源中也提到过)音节在语音中的发音可能略有不同,例如语音中:ma-kan-an,程序输出:ma-ka-nan。
编辑2: 好的。进一步研究表明,我错过了ny、sy和kh辅音。还修复了其他几个问题。这是更新的正则表达式:
"(ng|ny|sy|kh|[^aeiou])?[aeiou]((ng|ny|sy|kh|([^aeiou](?![gyh]))(?![aeiou])))?"