建议用Java创建一个翻译器

时间:2015-02-26 14:49:09

标签: java regex replace pattern-matching replaceall

我想要一个翻译 ex:英语到西班牙语。

我想将大文翻译成翻译地图。

HashMap <String, Object> hashmap = new HashMap <String, Object>();
hashmap.put("hello", "holla"); 
.
.
.
我应该使用 对象来处理1000字的初始文本? String或StringBuilder没问题?

如何进行大型替换?没有迭代每个单词与地图的每个元素?

我不想删除字符串中的每个单词,并看到我的地图中有匹配

也许带有单词首字母的多图?

如果您有任何答案或建议,谢谢

2 个答案:

答案 0 :(得分:1)

以下是一个示例实现:

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

答案 1 :(得分:1)

如果您事先知道所有单词,则可以轻松创建正则表达式 然后在运行时,编译一次正则表达式。那你很高兴。

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

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

将该对话框的压缩输出复制到 Rxform 标签(mdi)窗口 右键单击窗口以获取上下文菜单,选择 Misc Utilities - &gt;换行
将其设置为大约60个字符的宽度,按确定。

接下来,从Windows工具栏中按 C ++ 按钮调出 MegaString
对话。单击制作C风格的字符串 Lines Catenated-1 按OK 将结果复制并粘贴到Java源代码中。

使用带有回调的Replace-All中的正则表达式 在回调中,使用匹配作为哈希表中的键以返回
翻译替换。

它简单,一次通过哦,这么快。

有关该工具的更极端示例,请参阅130,000字词典的this正则表达式。

字母 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)?)))"