建议在 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)?)))"