建议在 Java 中创建翻译器
Advise to create a translator in Java
我想做一个翻译器 例如:英语到西班牙语。
我想翻译一份大文本,并附有翻译地图。
HashMap <String, Object> hashmap = new HashMap <String, Object>();
hashmap.put("hello", "holla");
.
.
.
我应该使用 object 来处理我的 1000 字初始文本吗? String 或 StringBuilder 可以吗?
如何做一个大的替换?没有 iterate 每个单词与地图的每个元素?
我不想获取字符串的每个单词,并查看我的映射中是否有匹配项
也许是单词首字母的多重映射?
如有任何解答或建议谢谢
这是一个示例实现:
import java.io.*;
import java.util.*;
public class Translator {
public enum Language {
EN, ES
}
private static final String TRANSLATION_TEMPLATE = "translation_%s_%s.properties";
private final Properties translations = new Properties();
public Translator(Language from, Language to) {
String translationFile = String.format(TRANSLATION_TEMPLATE, from, to);
try (InputStream is = getClass().getResourceAsStream(translationFile)) {
translations.load(is);
} catch (final IOException e) {
throw new RuntimeException("Could not read: " + translationFile, e);
}
}
private String[] translate(String text) {
String[] source = normalizeText(text);
List<String> translation = new ArrayList<>();
for (String sourceWord : source) {
translation.add(translateWord(sourceWord));
}
return translation.toArray(new String[source.length]);
}
private String translateWord(String sourceWord) {
Object value = translations.get(sourceWord);
String translatedWord;
if (value != null) {
translatedWord = String.valueOf(value);
}
else {
// if no translation is found, add the source word with a question mark
translatedWord = sourceWord + "?";
}
return translatedWord;
}
private String[] normalizeText(String text) {
String alphaText = text.replaceAll("[^A-Za-z]", " ");
return alphaText.split("\s+");
}
public static void main(final String[] args) {
final Translator translator = new Translator(Language.EN, Language.ES);
System.out.println(Arrays.toString(translator.translate("hello world!")));
}
}
然后将一个名为 'translation_EN_ES.properties' 的文件放在您的类路径中(例如 src/main/resources):
hello=holla
world=mundo
如果您事先知道所有单词,您可以轻松创建一个 Regex Trie。
然后在运行时,编译正则表达式一次。那你就可以开始了。
要创建正则表达式,请下载并安装 RegexFormat 5 here。
从主菜单,select 工具 -> 字符串到正则表达式 - 三元树
将列表粘贴到输入框中,然后按 生成 按钮。
它吐出一个完整的正则表达式 Trie,其速度与现有的任何哈希查找一样快。
将该对话框的压缩输出复制到 Rxform 选项卡 (mdi) window.
右击window得到上下文菜单,selectMisc Utilities -> Line Wrap
将其设置为大约 60 个字符的宽度,然后按确定。
接下来按 windows 工具栏中的 C++ 按钮调出 MegaString
对话。单击生成 C 样式字符串 连接 1 行 按确定。
将结果复制并粘贴到您的 Java 来源中。
在带回调的 Replace-All 中使用正则表达式。
在回调中,将匹配项用作哈希 table 到 return the
的键
翻译来代替。
很简单,一次通过,太快了。
有关该工具的更极端示例,请参阅 this 包含 130,000 个单词的字典的正则表达式。
字母样本 X
"(?:x(?:anth(?:a(?:m|n|te(?:s)?)|e(?:in|ne)|i(?:an|"
"c|n(?:e)?|um)|o(?:ma(?:s|ta)?|psia|us|xyl))|e(?:be"
"c(?:s)?|n(?:arthral|i(?:a(?:l)?|um)|o(?:biotic|cry"
"st(?:s)?|g(?:amy|enous|raft(?:s)?)|lith(?:s)?|mani"
"a|n|ph(?:ile(?:s)?|ob(?:e(?:s)?|ia|y)|ya)|time))|r"
"(?:a(?:fin(?:s)?|n(?:sis|tic)|rch|sia)|ic|o(?:derm"
"(?:a|i(?:a|c))|graphy|m(?:a(?:s|ta)?|orph(?:s)?)|p"
"h(?:agy|ily|yt(?:e(?:s)?|ic))|s(?:is|tom(?:a|ia))|"
"t(?:es|ic))))|i(?:pho(?:id(?:al)?|pag(?:ic|us)|sur"
"an))?|oan(?:a|on)|u|y(?:l(?:e(?:m|n(?:e(?:s)?|ol(?"
":s)?))|i(?:c|tol)|o(?:carp(?:s)?|g(?:en(?:ous)?|ra"
"ph(?:s|y)?)|id(?:in)?|l(?:ogy|s)?|m(?:a(?:s)?|eter"
"(?:s)?)|nic|ph(?:ag(?:an|e(?:s)?)|on(?:e(?:s)?|ic)"
")|rimba(?:s)?|se|tomous)|yl(?:s)?)|st(?:er(?:s)?|i"
"|o(?:i|s)|s|us)?)))"
我想做一个翻译器 例如:英语到西班牙语。
我想翻译一份大文本,并附有翻译地图。
HashMap <String, Object> hashmap = new HashMap <String, Object>();
hashmap.put("hello", "holla");
.
.
.
我应该使用 object 来处理我的 1000 字初始文本吗? String 或 StringBuilder 可以吗?
如何做一个大的替换?没有 iterate 每个单词与地图的每个元素?
我不想获取字符串的每个单词,并查看我的映射中是否有匹配项
也许是单词首字母的多重映射?
如有任何解答或建议谢谢
这是一个示例实现:
import java.io.*;
import java.util.*;
public class Translator {
public enum Language {
EN, ES
}
private static final String TRANSLATION_TEMPLATE = "translation_%s_%s.properties";
private final Properties translations = new Properties();
public Translator(Language from, Language to) {
String translationFile = String.format(TRANSLATION_TEMPLATE, from, to);
try (InputStream is = getClass().getResourceAsStream(translationFile)) {
translations.load(is);
} catch (final IOException e) {
throw new RuntimeException("Could not read: " + translationFile, e);
}
}
private String[] translate(String text) {
String[] source = normalizeText(text);
List<String> translation = new ArrayList<>();
for (String sourceWord : source) {
translation.add(translateWord(sourceWord));
}
return translation.toArray(new String[source.length]);
}
private String translateWord(String sourceWord) {
Object value = translations.get(sourceWord);
String translatedWord;
if (value != null) {
translatedWord = String.valueOf(value);
}
else {
// if no translation is found, add the source word with a question mark
translatedWord = sourceWord + "?";
}
return translatedWord;
}
private String[] normalizeText(String text) {
String alphaText = text.replaceAll("[^A-Za-z]", " ");
return alphaText.split("\s+");
}
public static void main(final String[] args) {
final Translator translator = new Translator(Language.EN, Language.ES);
System.out.println(Arrays.toString(translator.translate("hello world!")));
}
}
然后将一个名为 'translation_EN_ES.properties' 的文件放在您的类路径中(例如 src/main/resources):
hello=holla
world=mundo
如果您事先知道所有单词,您可以轻松创建一个 Regex Trie。
然后在运行时,编译正则表达式一次。那你就可以开始了。
要创建正则表达式,请下载并安装 RegexFormat 5 here。
从主菜单,select 工具 -> 字符串到正则表达式 - 三元树
将列表粘贴到输入框中,然后按 生成 按钮。
它吐出一个完整的正则表达式 Trie,其速度与现有的任何哈希查找一样快。
将该对话框的压缩输出复制到 Rxform 选项卡 (mdi) window.
右击window得到上下文菜单,selectMisc Utilities -> Line Wrap
将其设置为大约 60 个字符的宽度,然后按确定。
接下来按 windows 工具栏中的 C++ 按钮调出 MegaString
对话。单击生成 C 样式字符串 连接 1 行 按确定。
将结果复制并粘贴到您的 Java 来源中。
在带回调的 Replace-All 中使用正则表达式。
在回调中,将匹配项用作哈希 table 到 return the
的键
翻译来代替。
很简单,一次通过,太快了。
有关该工具的更极端示例,请参阅 this 包含 130,000 个单词的字典的正则表达式。
字母样本 X
"(?:x(?:anth(?:a(?:m|n|te(?:s)?)|e(?:in|ne)|i(?:an|"
"c|n(?:e)?|um)|o(?:ma(?:s|ta)?|psia|us|xyl))|e(?:be"
"c(?:s)?|n(?:arthral|i(?:a(?:l)?|um)|o(?:biotic|cry"
"st(?:s)?|g(?:amy|enous|raft(?:s)?)|lith(?:s)?|mani"
"a|n|ph(?:ile(?:s)?|ob(?:e(?:s)?|ia|y)|ya)|time))|r"
"(?:a(?:fin(?:s)?|n(?:sis|tic)|rch|sia)|ic|o(?:derm"
"(?:a|i(?:a|c))|graphy|m(?:a(?:s|ta)?|orph(?:s)?)|p"
"h(?:agy|ily|yt(?:e(?:s)?|ic))|s(?:is|tom(?:a|ia))|"
"t(?:es|ic))))|i(?:pho(?:id(?:al)?|pag(?:ic|us)|sur"
"an))?|oan(?:a|on)|u|y(?:l(?:e(?:m|n(?:e(?:s)?|ol(?"
":s)?))|i(?:c|tol)|o(?:carp(?:s)?|g(?:en(?:ous)?|ra"
"ph(?:s|y)?)|id(?:in)?|l(?:ogy|s)?|m(?:a(?:s)?|eter"
"(?:s)?)|nic|ph(?:ag(?:an|e(?:s)?)|on(?:e(?:s)?|ic)"
")|rimba(?:s)?|se|tomous)|yl(?:s)?)|st(?:er(?:s)?|i"
"|o(?:i|s)|s|us)?)))"