2016-07-18 27 views
0

Also im Grunde ist dies ein Parser/Cosinus-Matrix-Rechner, aber ich bekomme immer Kompilierfehler. Ich denke, ich habe den Weg für meine Eingabe, die Textdatei richtig zu lesen. Aber es wird immer noch nicht kompilieren.Kompilieren Fehler in meinem Parser, denke ich habe meine Eingabedatei falsch, aber unsicher, was falsch

Das ist meine Hauptklasse:

import java.io.FileNotFoundException; 
    import java.io.IOException; 

    public class TfIdfMain { 

    public static void main(String args[]) throws FileNotFoundException, IOException { 
     DocumentParser dp = new DocumentParser(); 
     dp.parseFiles("C:/Users/dachen/Documents/doc1.txt"); // give the location of source file 
     dp.tfIdfCalculator(); //calculates tfidf 
     dp.getCosineSimilarity(); //calculates cosine similarity 
    } 
} 

Meine Parser-Klasse:

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

public class DocumentParser { 

    //This variable will hold all terms of each document in an array. 
    private List<String[]> termsDocsArray = new ArrayList<String[]>(); 
    private List<String> allTerms = new ArrayList<String>(); //to hold all terms 
    private List<double[]> tfidfDocsVector = new ArrayList<double[]>(); 

    /** 
    * Method to read files and store in array. 
    */ 
    public void parseFiles(String filePath) throws FileNotFoundException, IOException { 
     File[] allfiles = new File(filePath).listFiles(); 
     BufferedReader in = null; 
     for (File f : allfiles) { 
      if (f.getName().endsWith(".txt")) { 
       in = new BufferedReader(new FileReader(f)); 
       StringBuilder sb = new StringBuilder(); 
       String s = null; 
       while ((s = in.readLine()) != null) { 
        sb.append(s); 
       } 
       String[] tokenizedTerms = sb.toString().replaceAll("[\\W&&[^\\s]]", "").split("\\W+"); //to get individual terms 
       for (String term : tokenizedTerms) { 
        if (!allTerms.contains(term)) { //avoid duplicate entry 
         allTerms.add(term); 
        } 
       } 
       termsDocsArray.add(tokenizedTerms); 
      } 
     } 

    } 

    /** 
    * Method to create termVector according to its tfidf score. 
    */ 
    public void tfIdfCalculator() { 
     double tf; //term frequency 
     double idf; //inverse document frequency 
     double tfidf; //term requency inverse document frequency   
     for (String[] docTermsArray : termsDocsArray) { 
      double[] tfidfvectors = new double[allTerms.size()]; 
      int count = 0; 
      for (String terms : allTerms) { 
       tf = new TfIdf().tfCalculator(docTermsArray, terms); 
       idf = new TfIdf().idfCalculator(termsDocsArray, terms); 
       tfidf = tf * idf; 
       tfidfvectors[count] = tfidf; 
       count++; 
      } 
      tfidfDocsVector.add(tfidfvectors); //storing document vectors;    
     } 
    } 

    /** 
    * Method to calculate cosine similarity between all the documents. 
    */ 
    public void getCosineSimilarity() { 
     for (int i = 0; i < tfidfDocsVector.size(); i++) { 
      for (int j = 0; j < tfidfDocsVector.size(); j++) { 
       System.out.println("between " + i + " and " + j + " = " 
            + new CosineSimilarity().cosineSimilarity 
             (
             tfidfDocsVector.get(i), 
             tfidfDocsVector.get(j) 
             ) 
           ); 
      } 
     } 
    } 
} 

Das ist mein Fehler:

Exception in thread "main" java.lang.NullPointerException 
    at DocumentParser.parseFiles(DocumentParser.java:22) 
    at TfIdfMain.main(TfIdfMain.java:7) 

Habe ich den Pfad zur Textdatei in meinem Dokument falsch eingegeben?

+2

Ich bin verwirrt - Sie sagen, Sie bekommen einen Kompilierungsfehler, aber dann zeigen Sie stattdessen eine Laufzeit Ausnahme. Könntest Du das erläutern? – ruakh

+0

Leider ich nicht, wo die Laufzeitfehler aus, Exception in thread "main" java.lang.NullPointerException \t bei DocumentParser.parseFiles (DocumentParser.java:22) \t bei TfIdfMain.main ist (TfIdfMain.java:7 –

Antwort

1

Der Windows-Dateipfad sollte \ statt / verwenden. Zusätzlich gab es hier einen weiteren Fehler, dass der Code nicht den gesamten Dateipfad benötigte, sondern nur den Verzeichnispfad. Also statt

dp.parseFiles("C:/Users/dachen/Documents/doc1.txt"); 

Sollte

sein
dp.parseFiles("C:\\Users\\dachen\\Documents"); 
+1

) könnten Sie die richtige Zeichenfolge zeigen ... –

+0

@mursaleen ahmad leider mr ahmad noch den Fehler: Exception in thread "main" java.lang.NullPointerException \t bei DocumentParser.parseFiles (DocumentParser.java:22) \t bei TfIdfMain.main (TfIdfMain.java:7) –

+0

Sollten Sie den gesamten Dateinamen im Pfad übergeben? In der 'parseFiles' Funktion machst du das schon:' File [] allfiles = new Datei (filePath) .listFiles(); ' –

0

Die Dokumentation für listFiles() heißt es, dass es:

Returns null if this abstract pathname does not denote a directory

Der Pfad, den Sie kein Verzeichnis sind vorbei ist.