косинусное сходство двух массивов в java

У меня есть 2 файла, содержащие веса терминов, моя цель состоит в том, чтобы вычислить косинусное сходство cos = dotproduct (weight1, weights2) / euclidianDistance (weight1) * euclidianDistance (weight2));

Это мой код:

import java.io.*;
import java.util.*;

public class tp5
{
    private static BufferedReader br1;
    private static BufferedReader br2;

    public static double getSimilarity(File file1, File file2)
        throws IOException
    {
        br1 = new BufferedReader(new FileReader(file1));
        String line1;
        line1 = br1.readLine();
        ArrayList<String> words1 = new ArrayList<String>();
        for (String word : line1.split(" ")) {
            words1.add(word);
        }

        br2 = new BufferedReader(new FileReader(file2));
        String line2;
        line2 = br2.readLine();
        ArrayList<String> words2 = new ArrayList<String>();
        for (String word : line2.split(" ")) {
            words2.add(word);
        }

        int i;
        int j;
        int k;

        //  Double [] temp = null;
        Double DotProduct = (double) 0 ;
        Double euclid1 = (double) 0;
        Double euclid2 = (double) 0; 

        for (j = 0; j < words1.size(); j++) {
            DotProduct += Double.parseDouble(words1.get(j)) * Double.parseDouble(words2.get(j));
        }

        for (i = 0; i < words1.size(); i++) {
            euclid1 = Math.pow(Double.parseDouble(words1.get(i)), Double.parseDouble(words1.get(i)));
        }

        euclid1 = Math.sqrt(euclid1);

        for (k = 0; k < words1.size(); k++) {
            euclid2 = Math.pow(Double.parseDouble(words2.get(k)), Double.parseDouble(words2.get(k)));
        }

        euclid2 = Math.sqrt(euclid2);

        return DotProduct / (euclid1 * euclid2);
    }

    public static void main(String[] args)
        throws IOException
    {
        File file1 = new File("texte.95-1.poids");
        File file2 = new File("texte.95-2.poids");

        System.out.println(getSimilarity(file1, file2));
    }
}

Проблема в том, что мои веса могут быть такими, например, weight = 0.750305594399894

У меня ошибка в Double.parseDouble

Exception in thread "main" java.lang.NumberFormatException: For input string: ""    0.750305594399894"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)

Каково решение?


person Amal Targhi    schedule 27.10.2016    source источник
comment
Проблема в том, что программа хочет сделать двойное из (как говорит вам Исключение). Итак, вы, вероятно, читаете пустую строку или что-то в этом роде (в какой-то момент строка в Double.parseDouble(String) пуста).   -  person Thomas Böhm    schedule 27.10.2016
comment
@ThomasBöhm извините, я не понимаю вас, что вы мне предлагаете, для меня это неоднозначно   -  person Amal Targhi    schedule 28.10.2016


Ответы (2)


Возникающее исключение NumberFormatException возникает, когда вы пытаетесь разобрать String на число, но это число написано небрежно. Вероятно, из-за запятой (попробуйте точку), из-за пустой строки или из-за буквы.

Надеюсь, я помог.

Хорошего дня. :)

person Saclyr Barlonium    schedule 27.10.2016
comment
спасибо за ответ, но я думаю, что проблема не в запятой, потому что у меня уже есть точка - person Amal Targhi; 28.10.2016
comment
опубликуйте свои тесты и результаты, чтобы четко видеть, что вы вводите. - person Saclyr Barlonium; 28.10.2016
comment
тест является общедоступным static void main, а результаты - упомянутой ошибкой - person Amal Targhi; 28.10.2016
comment
В методе вы запрашиваете ввод из файла. Просто скопируйте часть этого файла. - person Saclyr Barlonium; 28.10.2016
comment
это часть моего файла +0,750305594399894 +1,6863989535702288 +3,9889840465642745 0,14085438483348112 0,15096131193138845 +2,8903717578961645 +3,9889840465642745 +2,7362210780689065 +7,16703787691222 +4,68213122712422 +2,379546134130174 +0,6253667493143963 +2,6026896854443837 +4,68213122712422 я изменил код и у меня есть новая ошибка, вы можете проверить новый код и новую ошибку - person Amal Targhi; 29.10.2016
comment
split( String regex ) это очень хороший метод, однако, если у вас больше одного пробела между числами, он может создать пустой String. Попробуйте проверить в цикле for, если это пустой String. - person Saclyr Barlonium; 29.10.2016
comment
for (String word : line1.split())) { if( !word.isEmpty() ) words1.add(word); } - person Saclyr Barlonium; 29.10.2016

Только что использовал Double.valueOf(String number) и не имел проблем с вашими тестовыми примерами.

person Alikbar    schedule 31.10.2016