Каков порядок ввода ключей в методе redu () - PullRequest
0 голосов
/ 31 мая 2011

У меня есть простой случай использования.В моем входном файле мне просто нужно рассчитать процентное распределение общего количества слов.Например, слово 1 присутствует 10 раз, слово 2 присутствует 5 раз и т. Д., А общее количество слов равно 100, тогда мне просто нужно отобразить% word1 = 10%,% word2 = 5% и т. Д. Поэтому, когда я сталкиваюсь со словом, я просто помещаюcontext.write (word, 1) в map () и в сокращении суммирую отдельные подсчеты.Но для расчета процента нам понадобится общее количество слов.Я также рассчитываю это.

Следовательно, перед тем, как получить ключи для word1 или word2 в сокращении, я должен получить ключ общего количества слов для расчета процента для каждого слова.Но в сокращении я получаю этот общий ключ слова после некоторых других ключей.Поэтому я не могу рассчитать процент.

Я также попытался установить это общее количество в конфигурации карты, используя context.getConfiguration (). SetFloat ("total count", count);Но в сокращении я не могу получить это значение из конфигурации.Он просто возвращает ноль.

Любые предложения, пожалуйста, добавьте.

спасибо ..

1 Ответ

0 голосов
/ 31 мая 2011

Вам необходимо сначала переварить документ, например:

class WordCounter {
    Map<String, Integer> totals = new HashMap<String, Integer>();
    int wordCount;

    void digest(String document) {
        for (String word : document.split("\\w+")) {
            wordCount++;
            Integer count = totals.get(word);
            if (count == null)
                totals.put(word, 1);
            else
                totals.put(word, ++count);
        }
    }
}

Затем вы можете сделать второй проход по документу, делая то, что вам нравится, с собранной вами информацией, возможно, используя что-то вроде этого метода для каждого слова:

String decorateWithPercent(String word) {
    return word + " (" + (totals.get(word) / wordCount) + "%)";
}

Или распечатать частоты, что-то вроде:

void printFrequencies() {
    for (Map.Entry<String, Integer> wordCount : totals.entrySet()) {
        System.out.println(wordCount.getKey() + " " + wordCount.getValue());
    }
}
...