Я хочу сделать переводчика , например, с английского на испанский.

Я хочу перевести большой текст с картой для перевода.

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

Ведьмы объект , что я должен использовать для обработки моего исходного текста из 1000 слов? String или StringBuilder в порядке?

Как мне сделать большую замену ? Без итерации каждого слова с каждым элементом карты?

Я не хочу брать каждое слово в строке и видеть совпадение на моей карте

Может быть мультикарта с первой буквой слова?

Если у вас есть ответ или совет, спасибо

1
brouille 26 Фев 2015 в 17:49

2 ответа

Лучший ответ

Вот пример реализации:

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
Adriaan Koster 27 Фев 2015 в 10:30

Если вы заранее знаете все слова, вы легко сможете создать Regex Trie.
Затем во время выполнения скомпилируйте регулярное выражение один раз. Тогда тебе хорошо.

Чтобы создать регулярное выражение, загрузите и установите RegexFormat 5 здесь.

В главном меню выберите Инструменты -> Строки в регулярное выражение - Тернарное дерево
вставьте список в поле ввода и нажмите кнопку Создать .
Он выдает полное регулярное выражение Trie, которое выполняется так же быстро, как и любой другой поиск хэша.

Скопируйте сжатый вывод из этого диалогового окна в окно вкладки Rxform (mdi).
Щелкните правой кнопкой мыши окно, чтобы открыть контекстное меню, выберите Разные утилиты -> Перенос строки
установите ширину около 60 символов, нажмите ОК.

Затем нажмите кнопку C ++ на панели инструментов Windows, чтобы вызвать MegaString
диалог. Нажмите "Сделать строки C-стиля" Lines Catenated-1 и нажмите OK.
Скопируйте и вставьте результат в исходный код Java.

Используйте регулярное выражение в Replace-All с обратным вызовом.
В обратном вызове используйте совпадение в качестве ключа в хэш-таблице, чтобы вернуть
перевод заменить.

Это просто, за один проход и так быстро.

Более экстремальный пример этого инструмента см. В 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)?)))"
1
user557597user557597 26 Фев 2015 в 23:58