实施语言规则来音译泰语单词

时间:2014-03-25 17:01:05

标签: java algorithm nlp

我无法找到任何开放代码,以便将泰语脚本音译为语音等效词。 例如: สวัสดี可以音译为sà-wàt-di 对于中国人来说就像拼音一样。这使得外国脚本的学习者即使无法阅读剧本也能获得正确的发音。

ISO有一个定义的标准,它不可用,因为它是一个精确的音译,char是char。但是泰国人在其他角色之上和之后使用了字符。

有些网站和软件可以自动进行音译,因此可以自动执行此操作。尽管如此,没有可用的开放代码,我用英语和泰语搜索。有一些研究论文,但总是没有逻辑或代码,以高级方式描述该主题。

到目前为止我的方法: 我定义了泰语可能的音素并将其转录为英语:

我们有一些简单的字母总能发出相同的声音:

/*
x - consonants:
ก   ->  g
ข   ->  kh
ค   ->  kh
ฆ   ->  kh
ง   ->  ng
จ   ->  dsch
ฉ   ->  dsch
ช   ->  dsch
ซ   ->  s
ฌ   ->  dsch
ญ   ->  i
ฎ   ->  d
ฏ   ->  dt
ฐ   ->  th
ฑ   ->  th
ฒ   ->  th
ณ   ->  n
ด   ->  d
ต   ->  dt
ถ   ->  th
ท   ->  th
ธ   ->  th
น   ->  n
บ   ->  b
ป   ->  bp
ผ   ->  ph
ฝ   ->  f
พ   ->  ph
ฟ   ->  f
ภ   ->  ph
ม   ->  m
ย   ->  i
ร   ->  r
ล   ->  l
ว   ->  w
ศ   ->  s
ษ   ->  s
ส   ->  s
ห   ->  h
ฬ   ->  l
อ   ->  (silent)
ฮ   ->  h

然后我们有含有上述辅音的元音,最后形成一个音节。在下面的元音化合物中,辅音的可能位置由x代替。 Z是辅音的替代,辅音可以在音节的最后出现。并非所有上述辅音都出现在Z位置,只有Z下面进一步描述的那些辅助。

Vowels With เ
เxียว   ->  iauw
เxือย   ->  üüai
เx็อ    ->  ööh
เxิZ    ->  öh
เxาะ    ->  o
เxะ ->  e
เxียะ   ->  ia
เxือะ   ->  üa
เx็ว    ->  eu
เx็Z    ->  e
เxา ->  au
เxียZ   ->  iia
เxือZ   ->  üüa
เxอะ    ->  ö
เxZ ->  eh
เxว ->  eeu
เxีย    ->  iia
เxือ    ->  üüa
เxอ ->  öö
เx  ->  ee
เxย ->  ööi

Vowels With แ
แx็ว    ->  äu
แxว ->  ääu
แxะ ->  ä
แx็Z    ->  ä
แxZ ->  ää
แx  ->  ää

Vowels With ไ , ใ Or โ
โxZ ->  oo
โx  ->  oo
โxว ->  oou
โxะ ->  o
ไx  ->  ai
ใx  ->  ai
ไxย ->  ai
โxย ->  ooi

Vowels With อิ Or อี
xิZ ->  i
xิ  ->  i
xิว ->  iu
xีZ ->  ii
xี      ->  ii

Vowels With อุ Or อู
xุZ ->  u
xุ  ->  u
xุย ->  ui
xูZ ->  uu
xู  ->  uu

Vowels With อึ Or อื
xึZ ->  ü
xึ  ->  ü
xือ ->  üü
xืZ ->  üü

Vowels With า
xาย ->  aai
xาว ->  aau
xาZ ->  aa
xา  ->  aa

Vowels With อ
x็อZ    ->  o
x็อย    ->  oi
xอย ->  ooi
xอZ ->  oo
xอ  ->  oo

Vowels With อั Or ว
xัวะ    ->  ua
xัย ->  ai
xัว ->  ua
xัZ ->  a
xวย ->  uai
xวZ ->  ua

Remaining Vowels
xะ  ->  a
x่า ->  am
Inherent 'o'    ->  o

Z - possible final consonants:
ก   ->  g
ง   ->  ng
ด   ->  dt
น   ->  n
บ   ->  b
ม   ->  m
*/

我不确定哪种方法足够短以包含所有这些规则,而无需重新输入大量的if / else或switch / cases。此外,音节字符串可以包含可选字符:音调标记。情况并非总是如此,但经常如此。所以我的方法是首先从音调标记中剥离元音字符串,然后处理一些规则,如:

// example เดียว ->     diau
string vowel001 = "iau";

string thaiword = "เดียว";
if( thaiword.substring(0,1)=="เ" &&
    thaiword.substring(1,2)=="ี" && /*the unicode character moves above " which we don't have to care about*/
    thaiword.substring(2,3)=="ย" && 
    thaiword.substring(3,4)=="ว"){
    return getConsonantTransliteration(string.pos.1) + vowel001;
}

是否有更快更多的oop方法来做到这一点,而不是为每种可能性编写这样的规则?

EDIT2:

目前最快的方法似乎是正则表达式方法:

给出示例เอียว元音以及所有可能的变体:

เลียว
เลี้ยว
เหลียว
เหลี้ยว
เหี้ยว

find:       เ(ห{0,1})([ก-ฮ])ี([่้๊๋]{0,1})ยว
replace:    silenth[\1] initialcons[\2] tone[\3]

เลียว -->   silenth[] initialcons[ล] tone[]
เลี้ยว -->  silenth[] initialcons[ล] tone[้]
เหลียว -->  silenth[ห] initialcons[ล] tone[]
เหลี้ยว --> silenth[ห] initialcons[ล] tone[้]
เหี้ยว -->  silenth[] initialcons[ห] tone[้]

0 个答案:

没有答案