代码之家  ›  专栏  ›  技术社区  ›  brouille

建议使用Java创建翻译器

  •  1
  • brouille  · 技术社区  · 10 年前

    我想做一个 翻译 例如:英语到西班牙语。

    我想翻译一个 大型文本 带有翻译地图。

    HashMap <String, Object> hashmap = new HashMap <String, Object>();
    hashmap.put("hello", "holla"); 
    .
    .
    .
    

    女巫 对象 我应该用它来处理1000个单词的初始文本吗?字符串或StringBuilder可以吗?

    我怎么能做一个大的 代替 ? 没有 迭代 每个单词和地图的每个元素?

    我不想把字符串中的每一个单词都记下来,然后在我的地图中找到一个匹配项

    也许是一张带有单词首字母的多功能地图?

    如果你有任何回答或建议,谢谢

    2 回复  |  直到 9 年前
        1
  •  1
  •   Adriaan Koster    10 年前

    下面是一个示例实现:

    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!")));
        }
    }
    

    然后在类路径(例如src/main/resources)上放置一个名为“translation_EN_ES.properties”的文件:

    hello=holla
    world=mundo
    
        2
  •  1
  •   user557597 user557597    10 年前

    如果你事先知道所有的单词,你可以很容易地创建一个Regex Trie。
    然后在运行时,编译正则表达式一次。那你就可以走了。

    要创建正则表达式,请下载并安装RegexFormat 5 here .

    从主菜单中,选择 工具->Regex的字符串-三元树
    将列表粘贴到输入框中,然后按 生成 按钮
    它抛出一个完整的正则表达式Trie,它的速度与任何哈希查找一样快。

    将该对话框中的压缩输出复制到 Rxform格式 选项卡(mdi)窗口。
    右键单击窗口以获取上下文菜单,选择 其他实用程序->换行符
    将其设置为大约60个字符的宽度,然后按ok。

    下一步按 C++ 按钮,打开 MegaString(MegaString)
    对话单击生成C样式字符串 1类线 按OK。
    将结果复制并粘贴到Java源代码中。

    在“全部替换为”回调中使用正则表达式。
    在回调中,将匹配项用作哈希表的键,以返回
    要替换的翻译。

    它很简单,一次通过,噢,太快了。

    有关工具的更极端示例,请参见 this 13万单词词典的正则表达式。

    信件样本 十、

    "(?: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)?)))"