2014-12-10 2 views
1

Я пытаюсь вычислить tf и idf коллекции документов. Моя проблема в том, что я получаю бесконечность, и я не хочу бесконечности, но мне нужны двойные результаты.Результаты бесконечности

Вот мой код:

String key = entry.getKey().toString(); 
Integer value = entry.getValue().intValue(); 
System.out.println("key " + key + " value " + value); 

BigDecimal tf=new BigDecimal(entry.getValue()/collection.size()); 
BigDecimal idf=new BigDecimal(Math.log(counter/entry.getValue())); 
BigDecimal tfidf =new BigDecimal((tf.doubleValue())*(idf.doubleValue())); 
System.out.println("TF*IDF: " + key + ": " + tfidf.doubleValue()); 

вход: Карта, где строка является ключевым словом и Integer, сколько раз появляется слово в документе.

выход: ключевое слово + TF * IDF: номер

Любая идея, как решить эту проблему?

+2

Пожалуйста, дайте пример ввода, фактический выход и желаемый результат. – aioobe

+0

Я думаю, что idf никогда не будет 0, потому что карта всегда имеет что-то – user3310978

+0

Скорее всего, либо entry.getValue(), collection.size(), либо счетчик имеют значение 0. Это, скорее всего, причина того, что вы получаете бесконечность. Вам нужно отлаживать, чтобы убедиться, что либо неприемлемо, что одно из этих значений будет равно нулю, либо добавьте 1 к этим значениям, чтобы убедиться, что вы не получаете бесконечности. – Thresh

ответ

4

Вы можете иметь проблемы в следующей строке:

BigDecimal tf = new BigDecimal(entry.getValue()/collection.size()); 

Вы perfroming целое подразделение. Это может быть усечено до нуля. Попробуйте изменить это

BigDecimal tf=new BigDecimal((double) entry.getValue()/collection.size()); 

Та же проблема здесь:

new BigDecimal(Math.log(counter/entry.getValue())); 

изменить его

new BigDecimal(Math.log((double) counter/entry.getValue())); 
+0

Спасибо, что это сработало! – user3310978

Смежные вопросы