Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Amal TarghiОтветов: 2

У меня есть 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)

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

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

javacastingdoubledot-productinformation-retrieval

Ответы

Ответ 1 · Saclyr Barlonium

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

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

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

Ответ 2 · Alikbar

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы