Совет, если DRY может быть применен для следующего кода Java - PullRequest
0 голосов
/ 29 ноября 2018
public static HashMap<Language, Double> getBigramResult(ArrayList<Character> textCharList) {
        HashMap<Language, Double> totalProbabilities = new HashMap<Language, Double>();
        for (int j = 0; j < textCharList.size() - 1; j++) {
            if (textCharList.get(j) != '+' && textCharList.get(j + 1) != '+') {
                FileHandler.writeSentences("BIGRAM :"+textCharList.get(j)+""+textCharList.get(j + 1));
                for (int k = 0; k < biGramList.size(); k++) {
                    BiGramV2 temp = biGramList.get(k);
                    double conditionalProbability = Math.log10(temp.getConditionalProbabilty(textCharList.get(j),
                            textCharList.get(j + 1)));
                    updateTotalProbabilities(totalProbabilities,temp.getLanguage(),conditionalProbability);
                    FileHandler.writeSentences(temp.getLanguage().toString()+ ": p("+textCharList.get(j+1)+"|"+textCharList.get(j) +") ="+conditionalProbability+"==> log prob of sentence so far: " +totalProbabilities.get(temp.getLanguage()));
                }
                FileHandler.writeSentences("");
            }
        }
        return totalProbabilities;
    }

    public static HashMap<Language, Double> getUnigramResult(ArrayList<Character> textCharList) {
        HashMap<Language, Double> totalProbabilities = new HashMap<Language, Double>();
        for (int j = 0; j < textCharList.size(); j++) {
            if (textCharList.get(j) != '+') {
                FileHandler.writeSentences("UNIGRAM :"+textCharList.get(j));
                for (int k = 0; k < uniGramList.size(); k++) {
                    Unigram temp = uniGramList.get(k);
                    double conditionalProbability = Math.log10(temp.getProbabilty(textCharList.get(j)));
                    updateTotalProbabilities(totalProbabilities,temp.getLanguage(),conditionalProbability);
                    FileHandler.writeSentences(temp.getLanguage().toString()+ ": p("+textCharList.get(j)+") ="+conditionalProbability+"==> log prob of sentence so far: " +totalProbabilities.get(temp.getLanguage()));

                }
                FileHandler.writeSentences("");
            }
        }
        return totalProbabilities;
    }

public static void updateTotalProbabilities(HashMap<Language, Double> totalProbabilities,Language l,double conditionalProbability)
{

    Double oldValue = totalProbabilities.get( l);
    totalProbabilities.put( l,oldValue != null ? oldValue + conditionalProbability : conditionalProbability);

}

В приведенном выше коде ArrayList textCharList => Список строчных символов, включая '+'.

BiGramList - это список класса "BiGramV2", который имеет 2 метода "getLanguage ()", который возвращает либоГермания, английский или французский (как enum) и "getConditionalProbabilty ()", который принимает 2 символа и возвращает двойное значение.

Теперь почти аналогично UniGramList - список класса UniGram имеет 2 метода "getLangauge ()", которыеэто то же самое, что Bigram и "getProbabilty ()", который принимает 1 символ и возвращает двойное число.

Оба приведенных выше метода очень похожи, и я чувствую, что они неэффективны в дизайне, но я не могу их реорганизоватьиз-за разного внешнего цикла for, if block и разных методов вычисления вероятности.Любое предложение по моему коду будет оценено.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вы можете объявить интерфейс как

public interface Gram{
     ReturnType getLanguage();
     ReturnType getConditionalProbabilty();
}

, а затем реализовать из обоих BiGramV2 и Unigram .Затем вы можете применить принцип СУХОЙ, чтобы объединить этот метод с одним.

0 голосов
/ 29 ноября 2018

Возможно, вы захотите взглянуть на шаблон стратегии .

...