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 и разных методов вычисления вероятности.Любое предложение по моему коду будет оценено.