-3

我有一个字符串,例如:

"Xin chao moi nguoi"

我想以编程方式将该字符串转换为:

"Xin chào mọi người"

我只需要一个粗略的想法如何开始研究。有什么建议吗?

这不是翻译。下面的两个字符串都来自一种语言,但第一个字符串缺少变音符号。该程序会将变音符号添加到英文字母中。

a->ă

4

5 回答 5

3

我不确定是否有特定的库可以解决您的情况,但我不熟悉 Ruby 中的所有内容。但是,您可以尝试以下方法:

创建特殊编码单词的列表,以及基本字符到复杂字符的映射。

然后,当您对候选词进行基本编码时,逐个字符地过滤列表中匹配的词,保留那些与当前字符完全匹配的词,或者在先前定义的映射中有可接受的替代词.

一个快速而肮脏的例子:

wordList = ['chào', 'chao', 'chaobella'] #etc...
charMap = {'a'=>['a', 'à'], 'c'=>['c'], 'h'=>['h'], 'o'=>['o', 'ọ', 'ờ']} # etc...

word = 'chao'
filterList = wordList

# for each character in the word
word.split("").each_with_index do |char, index|
  # get the list of characters you'd like it to match
  matchingChars = charMap[char]
  # select the words that match at this index
  filterList = filterList.select{ |w| matchingChars.include? w.split("")[index] }
end

# filter out longer words
filterList = filterList.select{ |w| word.length == w.length }

puts "Words that match: " + filterList.join(",")

您仍然需要将其分解为一个函数,并确定如果有多个匹配的单词该怎么做。

于 2013-01-18T14:33:56.377 回答
2

您可以使用Unicode 组合字符并从其基本字符组合生成的字符:

   a   +   ̀      = à
U+0061 + U+0300

您可以通过Unicode分解得到组合字符,即规范化形式规范分解(NFD)。反之,将多个字符组合成一个字符,是规范化形式规范组合(NFC)。

您可以使用这个 Ruby Unicode 库进行组合和分解。

于 2013-01-18T15:14:07.503 回答
1

对于一对一的字符转换,有tr方法:

#encoding: utf-8
p "Xin chao moi nguoi".tr('aou', 'àọư')
#=>"Xin chàọ mọi ngưọi"
于 2013-01-18T16:07:30.817 回答
1

取决于你想做多少。如果你只是用 UTF-8 编码你的字符串(以 开始你的文件#encoding: utf-8),你可以制作一个基本的更改字典:

conversions = {
  "a" => "á",
  "e" => "é"
}
#And so on... (or with words, as @Hannele said)
str.gsub(/[aeiou]/, conversions)

随意将任何转换替换为您认为合适的方式。但是请记住,这将替换字符串中的所有元音。它不会做对人类语言有意义的事情。

于 2013-01-18T14:40:54.530 回答
-1

您正在将英语翻译成越南语。

一个使用 google api 将字符串从一种语言翻译成另一种语言的 Ruby gem 。

于 2013-01-18T14:27:48.070 回答