如何在Java中将句子分成音节

时间:2012-01-14 12:25:13

标签: java string words

  

可能重复:
  Detecting syllables in a word

假设输入字符串是“saya sedang makan nasi goreng” 我想把它分成音节: “sa”,“ya”,“se”,“dang”,“ma”,“kan”,“na”,“si”,“go”,“reng”

我怎样才能用Java做到这一点?有人能帮助我吗?

3 个答案:

答案 0 :(得分:1)

如果没有语音输入,你需要一个'音节词典'才能做到这一点。

编辑:It's been discussed on this site already

答案 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])))?"