假设输入字符串是“saya sedang makan nasi goreng” 我想把它分成音节: “sa”,“ya”,“se”,“dang”,“ma”,“kan”,“na”,“si”,“go”,“reng”
我怎样才能用Java做到这一点?有人能帮助我吗?
答案 0 :(得分:1)
如果没有语音输入,你需要一个'音节词典'才能做到这一点。
答案 1 :(得分:1)
这不是一件容易的事。但是,如果你仍然想要这样做,我认为你最好的选择是搜索一个字典数据库(它为每个单词提供音节细分,虽然这很难找到),下载它并编写一个程序来查询数据库并获取音节分手。
答案 2 :(得分: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();
}
修改强>
@Stephen C是对的。这是基于印度尼西亚语音节形成规则的适当解决方案(来自source)
在印尼语中,一个音节由一个元音加上立即组成 在辅音之前。它还包括跟随辅音的任何内容 不会紧接在下一个元音之前。
请注意, 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])))?"