必须在此正则表达式中更正哪些内容才能从印度尼西亚句子中提取发音?

What must be corrected in this regex to extract pronunciation from the indonesian sentence?

单词 ability 的英语发音是 4 个音节的发音: a、今天、明天、昨天

在印度尼西亚语中 kekuatan 的发音是 4 个音节: ke, ku, a, tan

规则如下:

这是来自印度尼西亚的例句

Saya akan menyambutnya di kampung. Kita saling menyayangi untuk minum air teh. menganggap menggertak minggu mencinta

我写过这样的正则表达式https://regex101.com/r/At64WO/3

[^aeiou]*[aeiou]+(?:[^aeiou]*$|[^aeiou](?=[^aeiou]))?

和结果

萨|萨|阿|坎|男人||但是|得到|吃|来|再次|g。 Ki|ta |sa|lin|g men|ya|这里|gi| un|一个人|num| 空气|嗯|但是|再次|来自|但是|那里|谢谢|min|ggu |但是|关闭|ta

我希望结果是(粗体标记)

萨|萨|阿|坎|我|尊重|但是|有|没有|来|增加。 |你|有|已经|阴茎[=5 =] |我|知道|的|很多| un|一个人|num| a|ir|呃。 |我|现在|差距| meng|ger|tak |ming|gu |but|close|ta

如果你还不明白,欢迎评论

您想将单词拆分成音节,音节以辅音序列开头,然后以元音结尾。

元音模式:a(?:[iu](?!(?:${consonant})+\b))?|o(?:i(?!(?:${consonant})+\b))?|[aeiou]
辅音模式:kh|n[yg]|sy|[bcdfghjklmnpqrstvwxyz]

音节的正则表达式方案是(?:${consonant})*(?:${vowel})(?:(?:${consonant})*(?=[^a-zA-Z]|$)|(?>${consonant})(?=(?:${consonant})))?但是 JS 正则表达式不支持原子组(参见(?>${consonant}))。因此,您需要使用带有捕获组和后向引用的正前瞻来模拟它 ((?=(${consonant})))。

这是 JS 演示:

const text = 'Saya akan menyambutnya di kampung. Kita saling menyayangi untuk minum air teh. menganggap menggertak minggu mencinta';
const consonant = 'kh|n[yg]|sy|[bcdfghjklmnpqrstvwxyz]';
const vowel = `a(?:[iu](?!(?:${consonant})+\b))?|o(?:i(?!(?:${consonant})+\b))?|[aeiou]`;
const regex = new RegExp(`(?:${consonant})*(?:${vowel})(?:(?:${consonant})*(?=[^a-zA-Z]|$)|(?=(${consonant}))\1(?=(?:${consonant})))?`, 'gi');
console.log(text.match(regex));

正则表达式是

/(?:kh|n[yg]|sy|[bcdfghjklmnpqrstvwxyz])*(?:a(?:[iu](?!(?:kh|n[yg]|sy|[bcdfghjklmnpqrstvwxyz])+\b))?|o(?:i(?!(?:kh|n[yg]|sy|[bcdfghjklmnpqrstvwxyz])+\b))?|[aeiou])(?:(?:kh|n[yg]|sy|[bcdfghjklmnpqrstvwxyz])*(?=[^a-zA-Z]|$)|(?=(kh|n[yg]|sy|[bcdfghjklmnpqrstvwxyz]))(?=kh|n[yg]|sy|[bcdfghjklmnpqrstvwxyz]))?/gi

参见regex demo

Malay/Indonesian 音节化是一个相当复杂的主题。一些谷歌搜索让我陷入了一个角落案例的兔子洞。这个答案主要是关于马来语,因为那是我所熟悉的,但我强烈怀疑它也可以应用于印度尼西亚语(除了一些奇怪的爪哇借词,但爪哇语也倾向于遵循相同的规则)。

语言学家倾向于将马来语音节分为 4 种结构:

  1. 简历
  2. VC
  3. CVC
  4. V

所以看起来你的正则表达式应该足够了。但请注意,语言学家将特殊发音 ng 归为一个字母(参见本文的示例:https://www.academia.edu/3001402)。因此,当您看到描述为 CVC 的音节时,请注意它包含 pengmeng 等发音。我不知道马来语中有任何包含 ng 的 3 字母音节,但我知道一些以 ngo 开头并以 ong 结尾的印尼语单词,所以让我们将其添加到我们的列表中。

鉴于ng的特殊处理,我们可以添加到音节结构列表中:

  1. Cg?V
  2. VCg?
  3. CVCg?
  4. V

考虑到我们要尽可能匹配 4 个字母组 CVCg? 而不是 VCg? 我将匹配顺序重新排序为:

  1. CVCg?
  2. VCg?
  3. Cg?V
  4. V

如果您将它们组合在一起,您将得到一个正则表达式:

[^aeiou][aeiou][^aeiou]g?|[aeiou][^aeiou]g?|[^aeiou]g?[aeiou]|[aeiou]

是的,这个正则表达式很长,可能可以简化(例如,前两组可能可以写成 [^aeiou]?[aeiou][^aeiou]g?),但这可能更容易推理和理解。


附录

Wiktor 的回答提醒我还有一个声音很特别:nya。因此可以通过以下方式改进模式:

  1. CVC[gy]?
  2. VC[gy]?
  3. C[gy]?V
  4. V

给出:

[^aeiou][aeiou][^aeiou][gy]?|[aeiou][^aeiou][gy]?|[^aeiou][gy]?[aeiou]|[aeiou]

这确实产生了更好的音节化。但我认为 Wiktor 的正则表达式会产生更好的结果。